我已经交了一些使用嵌套类的代码:
class outer : public YetAnotherObject
{
public:
outer();
~outer();
std::string* z;
private:
static outer* s_pInstance;
class inner : public QThread
{
public:
inner() : QThread() {}
~inner() {}
protected:
void run()
{
z = "Hello, world";
while (1) { ... whatever ... }
}
}innerObj; // <-- note edit is here
};
outer* outer::s_pInstance = 0;
outer* outer::instance(QObject* par)
{
if (s_pInstance == 0)
{
s_pInstance = new outer(par);
}
return s_pInstance;
}
z
在其他位置设置为指向std::string
。
在调用z
时,我收到编译错误或运行时崩溃,试图写入inner::start()
。
这样做的正确方法是什么?让inner
继承自outter
?公共还是私人?
注意:我在转录中遗漏了一个单词 - 内部对象的一个实例是在声明结束时创建的,请参阅代码中的注释指示符。
另请注意,我选择使用指针,而不是使用引用,因此o->z = "";
。我记不起任何通过自我引用而不是自我指针的方法。
扩展问题,请问如何将“this”传递给innerObj?
答案 0 :(得分:1)
向内部类添加指针或对外部类的引用。
class inner : public QThread
{
public:
inner(outer *o) : QThread(), o(o) { }
~inner() {}
protected:
void run()
{
o->z = "Hello, world";
while (1) { ... whatever ... }
}
private:
outer *o;
};
虽然你不能将文字(“Hello,world”)分配给指向std :: string的指针。
修改强>
根据需要更改了上面代码中对指针的引用,但您始终可以使用*this
进行自引用。
如果你想实例化内部,你可以这样做:
class outer : public YetAnotherObject
{
public:
outer() : innerObj(this) { ... }
~outer();
std::string* z;
private:
static outer* s_pInstance;
class inner : public QThread
{
...
}innerObj;
};
答案 1 :(得分:1)
您的代码中存在两个问题:
1)你不应该使用std :: string指针,因为它实际上不应该像那样使用。
2)C ++中的嵌套类独立于其外部类,即使它嵌套在其中。正如您所看到的,它与嵌套时的情况相同,例如与Java不同。嵌套类中没有隐式实例,等等。
为了访问外部类中的字符串或任何变量,您需要有一个指向outter类的引用或指针,例如以下列方式:
class outer : public YetAnotherObject
{
public:
outer();
~outer();
std::string z; // First modification
private:
static outer* s_pInstance;
class inner : public QThread
{
public:
inner(outer& o) : QThread(), outerRef(o) {} // Second modification
~inner() {}
outer& outerRef; // Third modification
protected:
void run()
{
z = "Hello, world";
while (1) { ... whatever ... }
}
};
};
outer* outer::s_pInstance = 0;
outer* outer::instance(QObject* par)
{
if (s_pInstance == 0)
{
s_pInstance = new outer(par);
}
return s_pInstance;
}