在课堂上的朋友功能

时间:2013-06-09 05:19:52

标签: c++

任何人都能帮帮我吗?我有我的档案:

prueba.h

#ifndef PRUEBA_H
#define PRUEBA_H

#include <iostream>
#include <cstring>

using namespace std;

class cadena{
  public:
   cadena();
   cadena(const char *c);
   cadena(int n);
   cadena(const cadena &Cad);
   ~cadena();
   void DevDir();
   void Asignar(const char *dest);
   char *Leer(char *c);
  private:
    char *cad;
    short valor;
    friend void tec(cadena obj);
};

#endif

prueba.cpp

#include "prueba.h"

cadena::cadena():cad(NULL),valor(128){}

cadena::cadena(const char *c){
  cad = new char[strlen(c)+1];
  strcpy(cad,c);
}

cadena::cadena(int n){
  cad = new char[n+1];
  cad[0] = 0;
}

cadena::cadena(const cadena &Cad){
  cad = new char[strlen(Cad.cad)+1];
  strcpy(cad,Cad.cad);
}

cadena::~cadena(){
  delete[] cad;
}

void cadena::DevDir(){
  cout << "dir valor: " << &cad << endl;
}

void cadena::Asignar(const char *dest){
  delete[] cad;
  cad = new char[strlen(dest)+1];
  strcpy(cad,dest);
}

char *cadena::Leer(char *c){
  strcpy(c,cad);
  return c;
}

void tec(cadena obj){
  cout << obj.valor << endl;
}

和我的文件主要:

#include "prueba.h"

int main(){
    cadena Cadena1;

    tec(Cadena1);

    cin.get();
    return 0;
}

问题是我的朋友功能(tec)。编译没问题,但是在运行时它会向我显示一个错误,就像内存访问冲突一样。

如果我删除main的这个功能,一切正常。

我使用Code :: blocks并使用debbuger模式向我显示:

  1. 错误在tec函数中为main。
  2. 错误在.cpp文件中,在构造函数副本定义中。
  3. 但是如果我删除main的tec功能,我就没有错误。

1 个答案:

答案 0 :(得分:2)

您当前的问题是您的默认构造函数会将cad初始化为NULL

cadena::cadena():cad(NULL),valor(128){}

但你的拷贝构造函数将其参数cad传递给strlen

cadena::cadena(const cadena &Cad){
  cad = new char[strlen(Cad.cad)+1];
  strcpy(cad,Cad.cad);
}

这是NULL时的非法行为。

在这种情况下,最简单的修复可能是明确检查NULL

cadena::cadena(const cadena &Cad){
  if(Cad.cad == NULL) {
    cad = NULL;
  } else {
    cad = new char[strlen(Cad.cad)+1];
    strcpy(cad,Cad.cad);
  }
}

但使用std::string而不是显式管理此内存会好得多。这将消除这个问题和其他几个问题。