#include <iostream>
class FooParent
{
public:
FooParent(int* new_p_bar)
{
p_bar = new_p_bar;
}
public:
int* p_bar;
};
class FooChild : public FooParent
{
public:
int bar;
public:
FooChild(int new_x)
:FooParent(&bar)
,bar(new_x) \\ point of concern
{}
};
int main()
{
FooChild foo(8);
std::cout << foo.bar << std::endl;
}
以上示例的工作方式与我想要的一样.i.e。将指针p_bar
链接到bar
。但是,我担心的是我指的是一个尚未调用其构造函数的成员。
此代码是否有效,或标准是否有关于它的说法。如果没有替代方案。
注意:在我的应用中,bar
是一个对象Bar
(不是int
),这有什么影响吗?
答案 0 :(得分:2)
如果要将指针传递给成员,则在尝试取消引用之前,没有任何未定义的行为。如果你想让构造函数调用base-from-member
idiom http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Base-from-Member
答案 1 :(得分:0)
看看这个:
class FooParent {
public:
FooParent(int* new_p_bar)
{
p_bar = new_p_bar;
*p_bar = 99; // this has no sense
}
void set99() {
*p_bar = 99; // this - has
}
public:
int* p_bar;
};
class FooChild : public FooParent
{
public:
int bar;
public:
FooChild(int new_x)
:FooParent(&bar)
,bar(new_x) // point of concern
{}
};
int main()
{
FooChild foo( 42 );
std::cout << foo.bar << std::endl;
foo.set99();
std::cout << foo.bar << std::endl;
}
我的意思是,如果FooParent
的构造函数仅将指针存储到外部int
(或Bar
- 无所谓),那么将会有没问题。
另一方面,如果您将bar
的副本发送给FooParent
- 就像这样
class FooParent
{
public:
FooParent(Bar new_p_bar)
{
p_bar = new_p_bar;
}
void set99() {
p_bar = 99; // this - has
}
public:
Bar p_bar;
};
class FooChild : public FooParent
{
public:
Bar bar;
public:
FooChild(Bar new_x)
:FooParent(bar)
,bar(new_x) // point of concern
{}
};
int main()
{
FooChild foo( 42 );
std::cout << foo.bar << std::endl;
foo.set99();
std::cout << foo.bar << std::endl;
}
这不起作用。即使Bar
具有复制c-tor或/和赋值运算符