为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
Why can't I define a object of class(which inherited another class) outside the main function?
我目前正在使用 fltk 库使用 VS15。当我尝试在 main 函数之外创建我的类的对象(继承Fl_Double_Window(时,程序崩溃了。
#include"FL/Fl.H"
#include"FL/Fl_Double_Window.h"
#include"FL/Fl_draw.h"
#include"FL/Fl_Slider.H"
#include"FL/Fl_Input.H"
#include"FL/Fl_Button.H"
#include"FL/Fl_Text_Display.H"
#include<string>
struct MyWindow :Fl_Double_Window {
MyWindow(string s):Fl_Double_Window(10, 10, 500, 500, s.c_str()){
color(FL_BLACK);
show();
}
};
MyWindow window("Special");
int main()
{
return Fl::run();
}
但是,当我直接创建类 Fl_Double_Window 的对象时(再次在 main 函数之外(,一切正常:
#include"FL/Fl.H"
#include"FL/Fl_Double_Window.h"
#include"FL/Fl_draw.h"
#include"FL/Fl_Slider.H"
#include"FL/Fl_Input.H"
#include"FL/Fl_Button.H"
#include"FL/Fl_Text_Display.H"
#include<string>
string name = "Special";
Fl_Double_Window window(10, 10, 500, 500, name.c_str());
int main()
{
window.color(FL_BLACK);
window.show();
return Fl::run();
}
我下载代码的人使用 C++11 在 Ubuntu 上运行代码,该程序在这两种情况下都可以工作。 我很困惑,我真的不知道问题是什么。
你遇到了崩溃,因为你在构造函数中放置了 show(如 @bruno 所述(。 如果你把 show 从构造函数中取出并把它放在 main 中,你不会得到你所看到的崩溃,但由于 Varshavchik @Sam提到的原因,标题将不正确。
struct MyWindow :Fl_Double_Window {
MyWindow(const std::string& s)
: Fl_Double_Window(10, 10, 500, 500) // 1) Do not set the title here
, caption(s) // 2) Take a copy of the title
{
// 3) Set the title here
this->copy_label(caption.c_str());
color(FL_BLACK);
// 4) Remove show from constructor
// show();
}
// 5) Declare caption - see Sam's solution
std::string caption;
};
MyWindow window("Special");
int main()
{
// 6) Move show here
window.show();
return Fl::run();
}
MyWindow(string s)
构造函数与函数没有太大区别。s
是构造函数的参数。一旦构造函数返回,s
就会被销毁。
:Fl_Double_Window(10, 10, 500, 500, s.c_str()){
c_str()
返回一个指向s
内容的指针,并将其传递给超类的构造函数。但是,由于s
将被销毁,因此对该指针的任何进一步使用都将成为未定义的行为,并可能崩溃。这显然是正在发生的事情。
解决方案稍微复杂一些。如果您仍然希望从FL_Double_Window
继承,这需要一个微妙的杂耍行为:
struct my_data {
string s_name;
my_data(string s) : s_name(s)
{
}
};
struct MyWindow :my_data, Fl_Double_Window {
MyWindow(string s): my_data(s),
Fl_Double_Window(10, 10, 500, 500, this->s_name.c_str()){
color(FL_BLACK);
show();
}
};
这扰乱了事物被构造和销毁的顺序,以便只要FL_DoubleWindow存在,s_name
类成员就继续存在。
还有一个(更(更容易的选项是传入引用,但是只要窗口对象存在,您就必须确保引用的std::string
存在。这种方法虽然略显繁琐,但也更加防弹。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值