2013-06-04 42 views
0

我有一个类定义为,通过引用使用函数调用时出现运行时错误?

class dimension{ 
public: 
    dimension(); 
    const char* getname(); 
    long ing getlength(); 
    void setname(const char* text) 
    void setlength(long int size) 
    virtual ~dimension(); 
private: 
    const char* name; 
    long int length; 
} 

我得到有关职能setnamesetlength错误是很重要的,以便其定义为,

void dimension::setname(const char* text) 
{ 
    dimension::name = text; 
} 
void dimension::setlength(long int size) 
{ 
    dimension::length = size;  
} 

现在我有2种功能,这我是用于从文件中读取类维度对象的数组。他们的定义是。现在

void read_dimension(dimension** dims, int*ndims, const char* text, long int size) 
{ 
    int i; 
    *dims = new dimension[*ndims]; 
    for(i=0; i<ndims; i++) 
    { 
     (*dims)[i].setname(text) 
     (*dims)[i].setlength(size) 
    } 
} 

void read_file(char *path, dimension** dims, int *ndims) 
{ 
    //do-- open file and read the variables ndims, text and size from it. 
    read_dimension(dims, ndims, text, size); 
    //do-- print name and length of all elements of (*dims). 
} 

,我在作为

int main() 
{ 
    //do-- get file path 
    dimesnion* gdims; 
    int num_dims; 
    read_file(path, &gdims, &num_dims); 
    //do-- print name and length of each element of gdims. 
    return 0; 
} 

当我运行代码从功能read_dimension()main()是不同的,但变量"length"打印的变量"name"是调用这些函数相同。
我不明白为什么会发生这种情况。
如果有人能帮忙,我会很高兴。

+0

在函数read_dimension中声明了哪些文本? – Claudio

+4

您发布的'read_dimension'似乎已被截断。特别是变量'text'从哪里来?请注意'name'只是一个char指针,所以如果你在离开'read_dimension'后删除了底层数组,'name'将指向垃圾。 – ComicSansMS

+1

为什么不使用'std :: string'和'std :: vector'来代替? –

回答

0

毫无疑问,text是read_dimension函数中的局部变量,可能是char数组。如前所述,dimension :: setname将一个指针指向另一个指针,当read_dimension函数中的文本变量超出范围时会发生什么?它会死亡......现在,维度类中的指针指向“无处”。 我更喜欢使用const char *作为字符串文字或作为指向字符数组中的某个char的指针。如果你想存储一个字符串,你可以通过strcpy来复制它,当然目标数组必须存在足够的空间。

这段代码的用途是什么:dimension :: name = text;和dimension :: length = size;在setname和setlength方法中?你处于维度类的范围内,对吗?

+0

谢谢,我得到了问题,一旦我超出了read_dimension的范围,指针指向无处。关于另一件事,我使用变量名称“名称”和“长度”而不是文本和大小,所以为了我自己的清晰度,我写了dimension :: name = name – user2401047

+0

我明白了。另外,如果用静态方法隐藏参数,则可以使用此指针访问某些成员。 – kvv

相关问题