C ++类成员表现为局部变量

时间:2017-09-23 14:59:50

标签: c++ string class oop

我刚开始用C ++编程,我发现了一个尴尬的问题。基本上:

  • 我有一个类,其成员是:,其中包含文件的完整路径。
  • 我有一个(char[MAX_LEN])指向文件的名称(没有完整路径)。

当我构造这个类时,我发现(char*)指针实际指向构造函数中的局部变量,从而获得错误的结果。

准确地说,课程是:

char*

例如,主要包括创建几个“File_t”实例并填充几个文件/ some / path / foo1,2,...

class File_t{
  public:
    char        fullPath[1024];
    char*            name;

File_t(){};  // Default constructor
File_t(const char* fullPath_){
  /*  Copy the input name on fullPath   */
  strncpy(fullPath, fullPath_, sizeof(fullPath));

  /* Auxiliary variable to remove the path */
  char* auxstr=fullPath;
  name = auxstr;

  /* Loop to remove the path  */
  while(1){ 
      auxstr = strstr(auxstr,"/");
      if(auxstr){auxstr=auxstr+1; name=auxstr;}
      else{break;}
  }
}
};

程序输出为:

int main(int argc, char* argv[]){

  const int N = 3;
  File_t CC[N];
  char fileName[100];

  for ( int i = 0; i < N; i++){
    sprintf(fileName,"%s%d","some/path/foo",i);
    CC[i] = File_t(&fileName[0]);
  }


  cout << "Summary" << endl;
  for (int i=0; i<N; i++) cout << "File " << CC[i].name << " in " << CC[i].fullPath << endl;


  return 0;
}

也就是说,名称指向构造函数的一些局部变量。我在Apple,GNU和英特尔编译器方面存在这个问题。

PS:我知道我应该避免在C ++中使用C风格的字符串,但这只是为了学习C ++基础知识。

2 个答案:

答案 0 :(得分:5)

代码中的问题是一个破坏的赋值运算符(和复制构造函数)。在这一行:

CC[i] = File_t(&fileName[0]);

您构建一个临时File_t对象,然后将其分配给CC[i]fullPath是一个数组,因此复制了所有元素。这可以。但name是一个指针,因此唯一复制的是指针本身。这是一个问题,因为它仍然指向临时对象的fullPath

在此语句结束时,临时对象将被销毁。现在CC[i].name是一个无效的指针。

要解决此问题,请定义适当的赋值运算符。它可能会做类似的事情:

strcpy(fullPath, other.fullPath);
name = fullPath + (other.name - other.fullPath);

答案 1 :(得分:0)

Melpomene得到了答案。没有指出复制过程,指针指向局部变量。

如果添加了复制程序(遵循他的建议):

File_t& operator=(const File_t& other)
{
    strcpy(fullPath, other.fullPath);
    name = &fullPath[0] + (other.name - &other.fullPath[0]);
    return *this;
}
然后程序就可以了。

谢谢大家的答案!