这是一些代码,我不理解某些概念。请帮忙!
现在在下面的代码中,当我创建some_obj1并尝试访问some_obj2中的表时,我能够访问internal_table吗?是创造了吗?
我觉得它不会,因为我在some_obj1的默认构造函数中什么都不做,我也没有在some_obj2的默认构造函数中创建它。
class some_obj1 {
public: // Updated
some_obj2 table; // table is a vector of int pointers.
some_obj1() {
//DO Nothing
}
}
class some_obj2 {
public: // Updated
std::vector<int *> internal_table;
some_obj2(){
internal_table.push(new int[10]);
}
}
main () {
some_obj1 make_a_object;
//Use the object created for some task.
// Access the internal_table in some_obj2. Will I be able to access it? is it created?
}
答案 0 :(得分:0)
在构造函数的左括号中,所有成员都已构造 - 默认构造(如果它们具有默认构造函数)或未初始化(如果它们是普通旧数据(POD)类别,如int或指针)。
请注意,如果您没有声明类和结构,您将自动获得类和结构的默认构造函数。这个还使用它们的默认构造函数正确地构造你的类类型成员。
如果您不想默认构造某些东西(或者如果您不能 - 因为它可能没有默认构造函数),您应该在初始化列表中初始化它。
答案 1 :(得分:0)
你有这里使用的简单的构图规则。
当你这么做时,第一件事就是创造出来:
some_obj1 make_a_object;
创建事物的顺序:
std::vector<int *> internal_table; //because some_obj2 will needs it
some_obj2 table; //because some_obj1 needs it
some_obj1 make_a_object; //is now finally ready
如果使用调试器,则很容易检测到。 3行只描绘了对象在那里完成的顺序创建它没有显示执行顺序,因为当然首先执行some_obj1 make_a_object。关键是这段代码首先触发其他事物的创建,当完成后,对some_obj1 make_a_object的调用将完成。
此代码也值得怀疑:
internal_table.push_back(new int[10]);
我认为只有一个元素,数组中的第一个元素将被推送到向量上。
答案 2 :(得分:0)
是的,你可以做你想做的事,但你需要修复语法和其他问题,比如
1)不声明构造函数的访问说明符将导致它被声明为private
,这将不允许创建其对象,这是单例设计模式的基础。
2)STL中没有为push
提供push_back
这样的方法。
3)类定义应以;
4)您将收到一个错误,没有类型some_obj2
来解决此问题,您应该进行前向声明或遵循序列。
#include <iostream>
#include <vector>
using namespace std;
class some_obj2 {
std::vector<int *> internal_table;
public:
some_obj2(){
internal_table.push_back(new int[10]);
}
};
class some_obj1 {
some_obj2 table; // table is a vector of int pointers.
public:
some_obj1() {
//DO Nothing
}
};
int main () {
some_obj1 make_a_object;
//Use the object created for some task.
// Access the internal_table in some_obj2. Will I be able to access it? is it created?
return 0;
}