假设我有一个类baseclass的对象:
// baseclass.h
class baseclass
{
baseclass() # default constructor, constructs baseclass object
}
在.cpp for baseclass:
// baseclass.cpp
baseclass::baseclass()
{
// member functions and variables
}
现在我的目标是拥有一个派生类,并在派生类的默认构造函数中,创建一个静态大小 n 基类对象的数组。为了尝试澄清,考虑这个的另一种方法是将基类视为扑克牌,我想通过调用派生类的默认构造函数来创建这些卡的数组(甲板)。我决定将问题的范围保持为抽象,所以我将继续使用base / derived,以便其他人可以更容易地看到它如何适用于它们。
我不确定以面向对象的方式设置它的最佳方法,到目前为止我有类似的东西,但我得到了segmentation fault。以下是我设置的方法:
// derivedclass.h (extending baseclass)
class derivedclass
{
// default constructor for derivedclass object
derivedclass();
// a pointer to an object of type baseclass
baseclass* bar;
// or should it be:
baseclass* bar[n] // where n is an integer
// or is there a better way to do it?
}
最后,因为我说过derivedclass对象可以有一个数组,所以我必须对.cpp for derivedclass中的默认构造函数设置为true:
// derivedclass.cpp
derivedclass::derivedclass()
{
// so I need to initialize the member array
baseclass* bar = new baseclass[n] // where n is the size I want to initialize
// the array to
}
我列出的任何情况都会导致分段错误吗?创建此对象数组的最佳方法是什么?很抱歉,如果这是一个不起眼的问题,我仍然是一个学习内存分配和指针的学生,通常会处理我不必担心的语言。此外,我试图将问题抽象为其他人的利益。提前谢谢!
答案 0 :(得分:3)
我不知道为什么你需要在这里使用动态分配。我宁愿做这样的事情,这也可以节省你在derivedclass
的构造函数中的一些工作:
struct baseclass
{
// Stuff...
};
struct derivedclass : baseclass
{
// Stuff...
baseclass objects[N];
};
在C ++ 11中,您应该使用std::array<>
而不是普通的C风格数组(std::array<>
是C风格数组的安全,零开销包装器):
// ...
#include <array>
struct derivedclass : baseclass
{
// Stuff...
std::array<baseclass, 10> objects;
};
答案 1 :(得分:1)
// so I need to initialize the member array
baseclass *bar = new baseclass[n];
除此之外,你没有初始化成员数组,只是一个与成员变量同名的局部变量,因此它会影响它(并且出于同样的原因,你也会泄漏内存丢失指向new
已分配数组的指针。)
答案 2 :(得分:1)
为什么要使用new
?为什么要从牌中获得牌组?甲板上有卡片。
class Card
{
// ... whatever card does
};
class Deck
{
public:
static int const CountOfCards = 36;
typedef std::array<Card,CountOfCards> Cards;
Cards cards;
// etc. ... whatever deck does
};