我了解面向对象编程的方法,但我已经习惯了Java,直到最近我才接触过C++.
我认为我的问题与语法无关,与C++中的OOP哲学有关.我理解指针和地址与堆栈和堆之间的区别,以及东西,但我仍然觉得我错过了一些东西.
这是一个例子:我有一个包含一些数据的类(Shape).我有另一个类(App)使用了许多形状.
class Square {
private:
int x;
int y;
int size;
public:
/* constructor */
Square(int x, int y, int size);
}
class App {
private:
Square redSquare;
Square blueSquare;
public:
void setup();
void draw();
}
Run Code Online (Sandbox Code Playgroud)
在某些时候,某些东西将实例化我的应用程序并调用setup().问题在于,当我声明App类(在App.hpp中,比方说)时,"redSquare"和"blueSquare"被实例化,而不仅仅是声明.作为一名Java程序员,我将在本例中在setup()中实例化我的类.但是这意味着我不能像上面那样做,我必须将redSquare和blueSquare设置为POINTERS,然后我可以在setup()中使用new创建它们.
但是你会怎么做呢?或者你会使用默认参数创建一个构造函数,如上所述创建redSquare和blueSquare,然后使用像Square.init(x,y,size)之类的东西在App.setup()中设置这些方块的值?或者其他一些方式?
你有没有汇总课程,或只有指针?
我当然可以通过这种方式破解它,所以它可以自己工作,但我有一种感觉,我正在做"Java方式",而不是得到C++程序员的想法.
在我看来,问题来自于"setup()"方法的存在.IIUC,意图是使用App作为:
App a;
a.setup();
Run Code Online (Sandbox Code Playgroud)
在调用setup()之前处于什么状态是"a"?如果调用draw()会发生什么?如果答案类似于"在使用App对象完成任何操作之前必须调用setup()",那么这意味着setup()是App的"真正"构造函数,而App的当前ctor是无意义的.结论:删除"setup()"方法并将其替换为有意义的ctor.
您需要在 App 构造函数中指定构造函数的参数,例如
App(int bx, int by, bsize, int rx, int ry, int rsize) :
blueSquare(bx, by, bsize), redSquare(rx, ry, rsize) {}
Run Code Online (Sandbox Code Playgroud)
这只是一个示例,您可能会使用更好的设计 IRL。