c ++中的动态对象不起作用

时间:2012-04-09 21:52:02

标签: c++ class object dynamic

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

class STRING {
    private:
        char *S[10];
    public:
        STRING();
        void set_str(int n, const char* str1);
        char* get_str(int n);
};

STRING :: STRING(){
    for (int i=0; (i < 9); i ++ ){
        S[i] = '\0';
        cout <<  S[i];
    }

}
void STRING :: set_str(int n,const char*str1) {
    S[n] = (char*)malloc(strlen(str1 + 1));
    strcpy(S[n], str1);
    cout << S[n];
}
char* STRING :: get_str(int n){
    return S[n];
}

int main () {

    cout << " Init \n";
    STRING* str = new STRING();
    cout << "Error \n";
return 0;

这个程序成功编译,运行,但是当它运行时它只能在对象 STRING * str = new STRING(); 的实体化之前工作。所以我在这种情况下看不到错误消息。有人能指出我的错误吗? 如果有更好的方法来初始化字符串数组,我很乐意知道。

我的目标是初始化蜇伤阵列。并且最初将整个数组的值设置为NULL。 此致

2 个答案:

答案 0 :(得分:2)

假设STRING表示“10个字符串的集合”,那么它就是你的构造函数。您正在设置指向字符'\ 0'的值的指针,而不是指向空指针。您正在为char *类型指定char类型。现在这可能有效,但是你有cout声明。它试图对指针进行DEREFERENCE。但是指针指向内存中的任何位置'\ 0',而不是那时的空字符。

编辑:在回答OP的问题时,我认为应该如何初始化为10个空char数组。您的构造函数将更改为:

STRING :: STRING(){
    for (int i=0; i < 10; i ++ ){ // changed to 10.  9 would miss the 10th element
        S[i] = new char[1]; // Length-1 char array
        S[i][0] = 0; // or '/0' or whatever
        cout <<  S[i];  // Prints nothing
    }
}

你还需要一个析构函数来释放内存:

STRING :: STRING〜() {     for(int i = 0; i&lt; 10; i ++){         删除[] S [i]; }

并将“set”方法更改为使用“new”而不是“malloc”。或者malloc和free的一切。但不要混淆它们。并记住使用“数组删除”而不仅仅是删除。

和FTLOG一样,转到书签this link。使用内置字符串类。

答案 1 :(得分:0)

该成员的正确声明应为:

 char S[10];   

你拥有它的方式

 char *S[10];

声明一个10 char *的数组。所以当你执行S[i] = '\0';时,你正在初始化S[i],这是一个指向char的指针,到'\0',这可能是NULL,所以你基本上都在调用cout << NULL在下一行。