2013-06-09 3 views
0

Может ли кто-нибудь мне помочь? У меня есть файлы:Функция друга в классе

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; 
} 

Проблема моя подруга функция (КТР) , Нет проблем с компиляцией, но при запуске он показывает мне ошибку, как при нарушении доступа к памяти.

Если я удалю эту функцию, все будет хорошо.

Я использую Code :: блоки и используя режим debbuger показать мне это:

  1. Это ошибка в основном, в функции ТЕС.
  2. Ошибка в файле .cpp, в определении копии конструктора.

Но если я удалю функцию tec main, у меня нет ошибок.

+0

Вы забыли следовать правилу три/пять/ноль. – chris

+0

Скомпилируйте все предупреждения и информацию об отладке (т. Е. С помощью 'g ++ -Wall -g' в Linux) и научитесь использовать отладчик (' gdb' в Linux). –

ответ

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 вместо явного управления этой памятью. Это устранит эту проблему и ряд других.

+0

Спасибо, что помогли, мой друг :-) –

+0

@ JavierRamírez: Добро пожаловать! – ruakh

Смежные вопросы