Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка при попытке использовать объект класса в определении другого класса  (Прочитано 15200 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Josefina
Участник

ru
Offline 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

А вот как это правильно сделать? .....   А черт его знает...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 03-11-2010 10:59 » new

в начало  заголовочного файла напиши

#pragma once

и всё Улыбаюсь
Записан

Josefina
Участник

ru
Offline Offline

« Ответ #2 : 03-11-2010 11:04 » 

Спасибо  Улыбаюсь эта ошибка исчезла, а еще одна осталась: syntax error : 'string'

Ругается на каждое объявление объекта, типа MyString. Если объект этот объявлять в CPP-ом файле, то ошибки не возникает, но мне нужно объявить именно в объявлении класса  Не понял
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 03-11-2010 11:14 » 

Josefina, а на что именно ругается, на какую строку ?
Записан

Josefina
Участник

ru
Offline Offline

« Ответ #4 : 03-11-2010 11:16 » 

Ругается на:
Код:
MyString buffer(2000);
    MyString out_buffer(2000);
    MyString log_buffer(1000);
    MyString sendlog_buffer(1000);


Еще добавлю: ошибка исчезает если обращаться к объекту следующим образом:

Код:
MyString buff();

Но у меня два конструктора с параметрами, без параметров конструкторов нет  С ума сойти...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Участник

ru
Offline 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 (воспринимает запись, как будто я функции создаю) и вот ругается, что это я вместо объявления параметров функции, непонятную константу пишу. Может такое быть?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 03-11-2010 11:48 » 

Josefina, а заголовочник в cpp файл включить не забыла ?
Записан

Josefina
Участник

ru
Offline Offline

« Ответ #8 : 03-11-2010 12:06 » 

Алексей1153++, не забыла  Здесь была моя ладья...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 03-11-2010 12:08 » 

прицепи проект (только удали *.ncb, RELEASE и DEBUG)

Добавлено через 51 секунду:
кстати, чем стандартные классы работы со строкой не устроили ? )
« Последнее редактирование: 03-11-2010 12:09 от Алексей1153 » Записан

Josefina
Участник

ru
Offline Offline

« Ответ #10 : 03-11-2010 12:17 » 

прицепи проект (только удали *.ncb, RELEASE и DEBUG)
можно по-подробнее, что значит прицепить проект? )))

кстати, чем стандартные классы работы со строкой не устроили ? )
Приходится много строк соединять, постоянные strcpy. strсat, memset + создание массовов строк, выделение памяти и удаление памяти раздувают код и делают его некрасивым, хочется немного "причесать", сделать интуитивно понятнее. Кроме того есть несколько нестандартных функций, которые парсят строку, хочу также их сюда добавить.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 03-11-2010 12:33 » 

Josefina,
"прицепить" - это значить сделать архив и приаттачить к посту ))

Цитата
Приходится много строк соединять, постоянные strcpy. strсat, memset + создание массовов строк,

#include <string>
класс std::string

Записан

Джон
просто
Администратор

de
Offline 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
Участник

ru
Offline Offline

« Ответ #13 : 03-11-2010 12:39 » 

Попробую, ночером отпишусь что получилось, что не получилось  Здесь была моя ладья...
Записан
Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 03-11-2010 15:17 » 

резервировать место при декларации нельзя.
а я и не обратил внимания Улыбаюсь В уме скомпилировать не смог Отлично
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #16 : 04-11-2010 08:53 » 

Код:
MyString buff();
Так ты объявляешь функцию, удали скобки.

Немного поправил код
баги в неём еще есть Улыбаюсь
как минимум надо хранить размер строки и размер буфера
избегай вычисления длинный строки, это очень дорого
Код:
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
Участник

ru
Offline Offline

« Ответ #17 : 08-11-2010 04:11 » 

Антон (LogRus), Джон, Алексей1153++, спасибо, разобралась, все получилось  Класс!

Теорию безусловно читаю  Да-да
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines