首先,我是c ++的新手。如果有更好的方法,那么一个结构,请提及它。
所以我想要做的是创建一个结构来存储指向某些自定义对象的指针。原因是我不必传递许多参数指针,我可以声明这个结构并将结构传递给需要这组对象的函数。
所有对象的原因是我正在与Web服务进行修复性交互。我已经创建了一个类来简化与Web服务的交互,并且不希望每次需要时都销毁它们并重新创建它们。
注意:这是在Qt 5中完成的
这是标题:
struct MyStruct
{
MyClass* Class1;
MyClass* Class2;
MyClass* Class3;
MyClass* Class4;
};
现在这是我试图填写结构的一小部分:
//Stucture of commonly used objects, for all to access
MyStruct* theStruct;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//Build object
MyClass* firstClass = new MyClass(/*params for object*/);
theStruct->Class1 = firstClass;
ui->setupUi(this);
connect(firstclass, SIGNAL(dataReady()),this,SLOT(updateWebStats(MyStruct)));
}
现在我得到错误:
App输出:
启动MyExe.exe 错误 - RtlWerpReportException失败,状态码为:-1073741823。将尝试
直接启动流程:
该程序意外完成。 MyExe.exe崩溃了
当我调试时,我得到一个弹出窗口
The inferior stopped because it received a signal from the Operating System.
Signal name : SIGSEGV
Signal meaning : Segmentation fault
此时调试器位于主窗口构造函数中的这一行:
theStruct->Class1 = firstClass;
答案 0 :(得分:2)
您正在尝试访问未分配的指针,这会导致分段错误。
尝试初始化它:
MyStruct* theStruct = new MyStruct();
答案 1 :(得分:2)
我不同意使用全局变量让生活更轻松的想法。 Are global variables bad?
但这是你的错误。
theStruct
,也必须初始化。
如果是静态成员,则应将其设置为零。
最好将类的指针设置为零。
struct theStruct
{
// default constructor
theStruct() : Class1(0), Class2(0), Class3(0), Class4(0) {}
MyClass* Class1;
MyClass* Class2;
MyClass* Class3;
MyClass* Class4;
};
然后在访问时,您应该检查以确保它已初始化为:
if(theStruct && theStruct->Class1)
theStruct->Class1->foo();
上述if语句的顺序执行以下操作:如果theStruct不为零,则调用new
并且是有效指针,并且如果Struct中的Class1不为零(也有{{1}调用它),然后使用它,因为它是安全可用的。
希望有所帮助。
答案 2 :(得分:0)
在您的示例中似乎没有理由使用指向MyStruct
的指针。你不应该使用一个,除非你有一些令人信服的理由,这似乎并非如此。如果您不使用指针,则无需在代码中使用new
对其进行初始化。它在编译时通过您的声明和定义自动初始化。
MyStruct theStruct;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//Build object
MyClass* firstClass = new MyClass(/*params for object*/);
theStruct.Class1 = firstClass;
ui->setupUi(this);
connect(firstclass, SIGNAL(dataReady()),this,SLOT(updateWebStats(&MyStruct)));
}
首先查看Resource Acquisition Is Initialization。很多程序员在没有必要时会自动使用C ++中的指针。只有在绝对需要它们时才使用指针,并且在C ++ 11中尽可能使用std::shared_ptr
和std::unique_ptr
。
不要将C ++与Java,Delphi或C#等语言混淆,后者要求您在免费商店中分配类,并仅使用引用/指针访问它们。在C ++中,您可以 为class
和struct
对象声明基于堆栈的变量。
如果有更好的方法可以做到这一点,那么请提一下结构。
std::vector<MyClass*>
可能更可取。请参阅:std::vector:
std :: vector是一个封装动态大小的序列容器 阵列。
元素是连续存储的,这意味着元素可以 不仅可以通过迭代器访问,还可以使用常规偏移 指向元素的指针。这意味着指向一个元素的指针 vector可以传递给任何需要指针的函数 数组的元素....