我試圖做一個程序,繪製到屏幕上,同時排序數組,如在此視頻:https://www.youtube.com/watch?v=kPRA0W1kECg。
這是我的問題:我重載了比較和賦值運算符,並且在賦值運算符中我想調用draw()
函數,該函數將繪製到屏幕上。但是當我這樣做時,我的代碼就會失敗,確切地說就是導致它崩潰的行SDL_RenderFillRect(renderer, &r)
。 (它開始運行然後崩潰,甚至不能在任務管理器中結束)。爲什麼我的程序在使用SDL_RenderFillRect()時崩潰?
我的代碼:
using namespace std;
int main(int argc, char *argv[])
{
srand(time(NULL));
SDL_Window *window = nullptr;
SDL_Renderer *renderer = nullptr;
window = SDL_CreateWindow("Rendezo algoritmus", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP);
renderer = SDL_CreateRenderer(window, 0, 0);
SDL_SetRenderDrawColor(renderer, 100, 100, 100, 255);
SDL_RenderClear(renderer);
SDL_Rect r;
r.y = 0;
r.x = 0;
r.w = 50;
r.h = 50;
SortHelper<int> mySortInts[] = { SortHelper<int>{2}, SortHelper<int>{5}, SortHelper<int>{1}, SortHelper<int>{4}, SortHelper<int>{3} };
std::vector<SortHelper<int>> myvector(mySortInts, mySortInts + 5);
SDL_Rect *rectArr = new SDL_Rect[myvector.size()];
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
int i = 0;
int rectXCoord = 0;
int rectWidth = (SDL_GetWindowSurface(window)->w)/myvector.size();
for (SortHelper<int> s : myvector) {
s.setRenderer(renderer);
rectArr[i].w = rectWidth;
rectArr[i].h = s.getHeight();
rectArr[i].x = rectXCoord;
rectArr[i].y = (SDL_GetWindowSurface(window)->h) - (rectArr[i].h);
rectXCoord += (SDL_GetWindowSurface(window)->w)/myvector.size();
SDL_RenderFillRect(renderer, &rectArr[i]);
SDL_RenderPresent(renderer);
}
std::sort(myvector.begin(), myvector.end());
SDL_Delay(500);
SDL_DestroyWindow(window);
SDL_Quit();
delete[] rectArr;
return EXIT_SUCCESS;}
而且我sorthelper.h:
#pragma once
class SDL_Renderer;
template<typename T>
class SortHelper {
T data;
int height;
int width;
int x;
int y;
SDL_Renderer *renderer;
public:
SortHelper(SortHelper &a) { data = a.data; }
SortHelper(T a) { data = a; }
bool operator<(SortHelper a) {
return data < a.data;
}
void operator=(SortHelper const a) {
data = a.data;
height = a.height;
draw();
SDL_Delay(10);
}
T getValue() { return data; }
int getHeight() {
return rand() % 500;
}
void setRenderer(SDL_Renderer *r) {
renderer = r;
}
void draw() {
SDL_Rect r;
r.x = x;
r.y = y;
r.w = width;
r.h = height;
SDL_RenderFillRect(renderer, &r);
SDL_RenderPresent(renderer);
}};
現在,我可能有一個想法是什麼原因造成的問題,但無法拿出,也沒有找到任何解決方案。我認爲代碼的破壞是在sorthelper.h
開始的SDL_Renderer
類聲明。但如果我刪除該聲明,我的代碼將不會編譯給出語法錯誤,我聲明SDL_Renderer *renderer;
。所以如果我是對的,我的問題是,我怎麼能在類中聲明一個SDL_Renderer成員變量?如果我不是,那麼問題是什麼?
一個簡單的問題:爲什麼你在這裏不使用vector [SDL_Rect * rectArr = new SDL_Rect [myvector.size()];'?爲什麼不只是:'std :: vector rectArr(myvector.size());' –
PaulMcKenzie
我沒有想到它,但我喜歡練習指針,也不需要vector的功能。可以肯定地改變,但我不認爲這是主要問題。 – Broccholio
此外,爲什麼您的'SortHelper'複製語義在用戶定義的複製構造函數和賦值運算符之間有所不同?複製構造函數和賦值操作符應該只是做這些操作,除非你想要一個充滿bug和怪異行爲的程序。事實上,複製構造函數是非常錯誤的。你應該複製所有的成員,而不僅僅是其中的一部分。 – PaulMcKenzie