我收到了这段代码:
#include <iostream>
#include <string>
using namespace std;
struct Base {
Base(string name) {
this->name = name;
}
string name;
};
struct Derived: Base {
string name2;
};
template <typename T>
T createNode(string name) {
Base* node = new Base(name);
return static_cast<T>(node);
}
int main() {
Derived* node = createNode<Derived*>("hej");
node->name2 = "bajs";
cout << node->name2;
}
node->name2 = "bajs";
行导致(随机)分段错误。我只是想知道如何纠正这个问题而不会导致分段错误。我仍然想调用createNode()
来创建基节点并在之后设置所有属性成员。它在c++
中是否可行?
答案 0 :(得分:2)
这段代码:
template <typename T>
T createNode(string name) {
Base* node = new Base(name);
return static_cast<T>(node);
}
创建一个Base
类型的对象。
此:
Derived* node = createNode<Derived*>("hej");
node->name2 = "najs"; // No need to use rude words, even if you think most people can't read them.
将创建的对象用作Derived
。由于Derived
需要比Base
更多的空间,因此当您使用name2
时,您将覆盖createNode
中创建的对象之外的内容。 name2
也未被构造,这意味着赋值很可能使用随机垃圾值,这本身可能导致崩溃。
您需要重新排列代码,使其首先创建正确的对象,如果您想使用构造函数,则需要使用Derived
的构造函数来获取命名对象。 [还有其他一些方法可以实现这一目标,但通常不是你想要的]
答案 1 :(得分:1)
也许,我不明白你的计划的想法,但我想,它必须是这样的:
#include <iostream>
#include <string>
using namespace std;
struct Base {
Base(string name) {
this->name = name;
}
string name;
};
struct Derived: Base {
Derived(string name):Base(name)
{
}
// string name2; // it is not needed
};
template <typename T>
T* createNode(string name) {
T* node = new T(name);
return node;
}
int main() {
Derived* node = createNode<Derived>("hej");
node->name = "bajs";
cout << node->name;
}