Josefina
Участник
Offline
|
|
« : 03-11-2010 10:56 » |
|
Прошу помощи.... есть созданный класс работы со строкой: "MyString.h" class MyString { public: MyString(const char*); MyString(int); ~MyString(); public: void Clear(); char* MString; int length; char& operator[] (int i) {return MString[i];} friend MyString& operator + (MyString&, MyString&); }; Хочу использовать объект этого класса в "ethernet.h", то есть: class Ethernet { public: Ethernet(); ~Ethernet(); int Connect(); int Disconnect(); int SetIP(IP_st &newIP); int GetIP(IP_st &curIP); bool IsConnected() private: SOCKET eth_socket; IP_st ip; bool on_connected; sockaddr_in eth_addr; int socket_error; int shift; MyString buffer(2000); MyString out_buffer(2000); MyString log_buffer(1000); MyString sendlog_buffer(1000); HANDLE socket_handle; }; Выдает ошибку: 'MyString' : 'class' type redefinition Если я понимаю правильно, то в заголовочный файл нужно вводить нечто подобное: #ifndef MYSTRING_H #define MYSTRING_H А вот как это правильно сделать? .....
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 03-11-2010 10:59 » |
|
в начало заголовочного файла напиши #pragma once и всё
|
|
|
Записан
|
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #2 : 03-11-2010 11:04 » |
|
Спасибо эта ошибка исчезла, а еще одна осталась: syntax error : 'string' Ругается на каждое объявление объекта, типа MyString. Если объект этот объявлять в CPP-ом файле, то ошибки не возникает, но мне нужно объявить именно в объявлении класса
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 03-11-2010 11:14 » |
|
Josefina, а на что именно ругается, на какую строку ?
|
|
|
Записан
|
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #4 : 03-11-2010 11:16 » |
|
Ругается на: MyString buffer(2000); MyString out_buffer(2000); MyString log_buffer(1000); MyString sendlog_buffer(1000); Еще добавлю: ошибка исчезает если обращаться к объекту следующим образом: Но у меня два конструктора с параметрами, без параметров конструкторов нет
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 03-11-2010 11:31 » |
|
class MyString { char* MString; int length; char& operator[] (int i) {return MString[i];} /*friend*/ MyString& operator + (MyString&, MyString&) { чивота забыла; }
public: MyString(const char*) { чивота забыла; }
MyString(int) { чивота забыла; }
~MyString() { чивота забыла; }
public: void Clear() { чивота забыла; }
};
|
|
« Последнее редактирование: 03-11-2010 11:34 от Алексей1153++ »
|
Записан
|
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #6 : 03-11-2010 11:41 » |
|
Да, вроде бы ничего не забыла, вот код: MyString::MyString(const char* Str) { MString = new char [strlen(Str)]; strcpy(MString,Str); length = strlen(Str); }
MyString::MyString(int len) { MString = new char [len]; memset(MString,len,NULL); length = len; }
MyString::~MyString() { delete[] MString; }
void MyString::Clear() { memset(MString,NULL,strlen(MString)); }
MyString& operator + (MyString& Str1, MyString& Str2) { int len = strlen(Str1.MString) + strlen(Str2.MString); MyString Str(len); strcpy(Str.MString,Str1.MString); strcat(Str.MString,Str2.MString); return Str; } Если использовать это объявление внутри CPP-шного кода, то все работает как надо, никаких ошибок. У меня такое ощущение, что программа пытается, не создать объект типа MyString, а создать функцию типа MyString (воспринимает запись, как будто я функции создаю) и вот ругается, что это я вместо объявления параметров функции, непонятную константу пишу. Может такое быть?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 03-11-2010 11:48 » |
|
Josefina, а заголовочник в cpp файл включить не забыла ?
|
|
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 03-11-2010 12:08 » |
|
прицепи проект (только удали *.ncb, RELEASE и DEBUG)
Добавлено через 51 секунду: кстати, чем стандартные классы работы со строкой не устроили ? )
|
|
« Последнее редактирование: 03-11-2010 12:09 от Алексей1153 »
|
Записан
|
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #10 : 03-11-2010 12:17 » |
|
прицепи проект (только удали *.ncb, RELEASE и DEBUG) можно по-подробнее, что значит прицепить проект? ))) кстати, чем стандартные классы работы со строкой не устроили ? ) Приходится много строк соединять, постоянные strcpy. strсat, memset + создание массовов строк, выделение памяти и удаление памяти раздувают код и делают его некрасивым, хочется немного "причесать", сделать интуитивно понятнее. Кроме того есть несколько нестандартных функций, которые парсят строку, хочу также их сюда добавить.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 03-11-2010 12:33 » |
|
Josefina, "прицепить" - это значить сделать архив и приаттачить к посту )) Приходится много строк соединять, постоянные strcpy. strсat, memset + создание массовов строк,
#include <string> класс std::string
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 03-11-2010 12:34 » |
|
Насколько я не забыл С++, резервировать место при декларации нельзя. Нужно делать так:
MyString m_buffer;
потом в cpp-файле:
Ethernet::Ethernet() : m_buffer(2000) {
}
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #13 : 03-11-2010 12:39 » |
|
Попробую, ночером отпишусь что получилось, что не получилось
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 03-11-2010 12:45 » |
|
А ещё лучше (на всё оставшуюся жизнь) дополнительно таки почитать теорию, например Страуструпа.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 03-11-2010 15:17 » |
|
резервировать место при декларации нельзя.
а я и не обратил внимания В уме скомпилировать не смог
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #16 : 04-11-2010 08:53 » |
|
Так ты объявляешь функцию, удали скобки. Немного поправил код баги в неём еще есть как минимум надо хранить размер строки и размер буфера избегай вычисления длинный строки, это очень дорого MyString::MyString(const char* Str) { length = strlen(Str) + 1; MString = new char [length]; strcpy(MString, Str); MString[length-1] = 0; }
MyString::MyString(int len) { MString = new char [len]; MString[0] = 0; length = len; }
MyString::~MyString() { delete[] MString; }
void MyString::Clear() { MString[0] = 0; }
MyString& operator + (MyString& Str1, MyString& Str2) { int len = Str1.length +Str2.length; MyString Str(len + 1); strcpy(Str.MString,Str1.MString); strcpy(Str.MString+Str1.length,Str2.MString); return Str; // SegFault }
|
|
|
Записан
|
Странно всё это....
|
|
|
Josefina
Участник
Offline
|
|
« Ответ #17 : 08-11-2010 04:11 » |
|
Антон (LogRus), Джон, Алексей1153++, спасибо, разобралась, все получилось Теорию безусловно читаю
|
|
|
Записан
|
|
|
|
|