1

我试过这个:

int n;
cin >> n;
int * pn = new int[n];

然后我可以像这样使用数组:pn[i] = ...

但我想用我自己的班级组织一些类似的东西:

class MyString
{
    char* m_pStr;
    public:
    MyString(const char* pStr){ 
        this->CreateArray(pStr);
        strcpy(m_pStr, pStr);
    }
}

void main(){
    int N;
    cout << "Iinput N: ";
    cin >> N;
    MyString * ar = new MyString[N];

    char tmp[100];
    for (int i = 0; i < 4; i++){
        cout <<"Input the string for the Mystring " << i + 1 << " ";
        cin >> tmp;     
        ar[i] = MyString(tmp);
    }
}

我得到:错误 C2512:'MyString':没有合适的默认构造函数可用。

4

3 回答 3

0

您忘记包含默认构造函数

MyString() : m_pStr(0) { }

当您尝试从此处实例化 MyStrings 数组时发生该错误:

MyString * ar = new MyString[N];

它寻找一个默认的构造函数。由于您没有在类定义中定义一个,因此您遇到了您描述的错误。

因此,要解决您的问题,请为您的类创建默认构造函数,并且所有内容都应该按应有的方式编译。

有关更多详细信息,请参阅此链接(或阅读一些 C++):

http://en.wikipedia.org/wiki/Default_constructor

于 2013-03-10T07:11:49.187 回答
0

好的,我会在上面的代码中更改很多内容。

首先,回答您的问题:并不总是需要默认构造函数。事实上,如果你没有定义任何构造方法,那么默认的构造方法就会被自动调用。但是,由于您定义了带有参数的构造函数,因此您需要定义其行为。如果您不希望在代码中调用它,private请在类定义中定义它。现在,一旦你解决了这个问题,你就会遇到其他问题:

  1. this是指向当前对象的指针,而您正试图取消引用它并获取CreateArray不存在的成员函数。

  2. 在 C++ 中编码时永远不要使用 C 风格的字符串,因为您可以创建string对象,并且如果您需要 c 风格的字符串,您可以使用string名为c_str().

  3. 不要使用void主程序。并非所有编译器都允许它

  4. 释放动态创建的数组使用的内存,使用delete [] ar

所以,代码有很多问题。我认为这里真正的问题是你可能会一些 C,并且你正在急于学习 C++,但请记住,正确学习一门语言需要耐心,仅仅因为你的代码可能工作,并不意味着它很好代码,如果你想正确学习一门语言,你应该付出更多的努力。相信我,我已经学会了艰难的方式!

于 2013-03-10T07:49:16.423 回答
0

您正在尝试MyString使用默认构造函数来实例化该类,而没有在这一行中定义一个:

MyString * ar = new MyString[N];

它必须初始化对象,因此会尝试使用未设置的默认构造函数。

我会亲自更改您的构造函数:

MyString(const char* pStr);

至:

MyString(const char* pStr = "");

为了表现得像默认的一样。

于 2013-03-10T07:11:31.307 回答