Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как структуры описать в классе ? доступ к членам класса 
:(
    Опции темы
izoomer
Дата 20.2.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



описал в заголовочном файле jmix.h
Код

public:
    jmix();
    ~jmix();

    typedef struct channel{
        string name;
        int volume(){
            return mixer->volume(name);
        }
        bool mute(){
            return mixer->mute(name);
        }
        void setVolume( uint vol ){
            mixer->setVolume(name,vol);
        }
        void setMute( bool vol){
            mixer->setMute(name,vol);
        }
    } channel;

    channel* operator[] (unsigned i) {
        return channels[i];
    }

private:
    static Mixer * mixer;
    list<channel*> channels;
};


а когда пытаюсь использовать :
Код

    jmix * mixer= new jmix();
    bar->setTitle(mixer[i].name);
    bar->setPosition(mixer[i].volume());
    bar->setMuted(mixer[i].mute());

ругается что :

JMixer.cpp:168: ошибка: ‘class jmix’ has no member named ‘name’
JMixer.cpp:169: ошибка: ‘class jmix’ has no member named ‘volume’
JMixer.cpp:170: ошибка: ‘class jmix’ has no member named ‘mute’
JMixer.cpp:173: ошибка: ‘class jmix’ has no member named ‘name’

подскажите как правилньо определить структуру .. что я не так делаю?

PM MAIL   Вверх
Avaj
Дата 20.2.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 14.7.2008
Где: Владивосток.

Репутация: 1
Всего: 3



убери typedef.

Это сообщение отредактировал(а) Avaj - 20.2.2009, 13:11
PM MAIL   Вверх
izoomer
Дата 20.2.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Цитата(Avaj @ 20.2.2009,  13:08)
убери typedef.

убрал, тот же эффект, таже ошибка
PM MAIL   Вверх
mes
Дата 20.2.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(izoomer @  20.2.2009,  11:49 Найти цитируемый пост)
channel* operator[] 

Цитата(izoomer @  20.2.2009,  11:49 Найти цитируемый пост)
mixer[i].name

mixer[i]->name

Это сообщение отредактировал(а) mes - 20.2.2009, 13:40


--------------------
PM MAIL WWW   Вверх
izoomer
Дата 20.2.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Цитата(mes @ 20.2.2009,  13:32)
Цитата(izoomer @  20.2.2009,  11:49 Найти цитируемый пост)
channel* operator[] 

Цитата(izoomer @  20.2.2009,  11:49 Найти цитируемый пост)
mixer[i].name

mixer[i]->name

JMixer.cpp:168: ошибка: base operand of ‘->’ has non-pointer type ‘jmix'

PM MAIL   Вверх
mes
Дата 20.2.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



упс.. не заметил, что
Цитата(izoomer @  20.2.2009,  11:49 Найти цитируемый пост)
jmix * mixer = 


тогда : (*mixer)[i]->name

Это сообщение отредактировал(а) mes - 20.2.2009, 13:43


--------------------
PM MAIL WWW   Вверх
izoomer
Дата 20.2.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Цитата(mes @ 20.2.2009,  13:41)
упс.. не заметил, что
Цитата(izoomer @  20.2.2009,  11:49 Найти цитируемый пост)
jmix * mixer = 


тогда : (*mixer)[i]->name

все равно не хочет 

JMixer.cpp:168: ошибка: нет подходящей функции для вызова ‘JSlider::setTitle(<unresolved overloaded function type

не пойму почему mixer[i] пытается вернуть jmix а не channel ... описано ведь четко :
Код

channel* operator[] (unsigned int i){
return channels[i];
}

[] возвращает то channel ... 


Это сообщение отредактировал(а) izoomer - 20.2.2009, 13:58
PM MAIL   Вверх
mes
Дата 20.2.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(izoomer @  20.2.2009,  12:54 Найти цитируемый пост)
не пойму почему mixer[i] пытается вернуть jmix а не channel ... описано ведь четко :

потому что mixer у Вас указатель и operator [] применяется к нему, расценивая что Вы рассматриваете этот указатель, как указатель на массив.
и как следствие возвращает объект типа jmix. 
Чтоб воспользоваться переопределенным оператором[] класса: нужно разыменовать указатель
так (*mixer)[..] или так mixer->operator[](..)


Цитата(izoomer @  20.2.2009,  12:54 Найти цитируемый пост)
все равно не хочет 

JMixer.cpp:168: ошибка: нет подходящей функции для вызова ‘JSlider::setTitle(<unresolved overloaded function type

а Вы случайно после name не поставили скобки ?
если нет, то покажите эту строчку .

и еше у std::list нет прямого доступа к элементам. можно заменить list на vector.


--------------------
PM MAIL WWW   Вверх
izoomer
Дата 20.2.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Цитата(mes @ 20.2.2009,  14:32)

потому что mixer у Вас указатель и operator [] применяется к нему, расценивая что Вы рассматриваете этот указатель, как указатель на массив.
и как следствие возвращает объект типа jmix. 
Чтоб воспользоваться переопределенным оператором[] класса: нужно разыменовать указатель
так (*mixer)[..] или так mixer->operator[](..)


а Вы случайно после name не поставили скобки ?
если нет, то покажите эту строчку .

и еше у std::list нет прямого доступа к элементам. можно заменить list на vector.

нет , скобки не ставил 

bar->setTitle(mixer[i].name);

А вот что пишет когда разименовываю:

JMixer.cpp:168: ошибка: запрос элемента ‘name’ в ‘((JMixer*)this)->JMixer::mixer->jmix::operator[](i)’, имеющего не классовый тип ‘channel'


Это сообщение отредактировал(а) izoomer - 20.2.2009, 16:00
PM MAIL   Вверх
mes
Дата 20.2.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(izoomer @  20.2.2009,  14:44 Найти цитируемый пост)
bar->setTitle(mixer[i].name); 

???  smile это последний вариант ? a где исправления ?
Код

bar->setTitle((*mixer)[i]->name);

и

Цитата(mes @  20.2.2009,  13:32 Найти цитируемый пост)
и еше у std::list нет прямого доступа к элементам. можно заменить list на vector. 



Это сообщение отредактировал(а) mes - 20.2.2009, 16:06


--------------------
PM MAIL WWW   Вверх
izoomer
Дата 20.2.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Цитата(mes @ 20.2.2009,  16:01)
Цитата(izoomer @  20.2.2009,  14:44 Найти цитируемый пост)
bar->setTitle(mixer[i].name); 

???  smile это последний вариант ? a где исправления ?
Код

bar->setTitle((*mixer)[i]->name);

и

Цитата(mes @  20.2.2009,  13:32 Найти цитируемый пост)
и еше у std::list нет прямого доступа к элементам. можно заменить list на vector. 

Исправил на:

bar->setTitle((*mixer)[i]->name);

и вот что стал писать:

JMixer.cpp:168: ошибка: запрос элемента ‘name’ в ‘((JMixer*)this)->JMixer::mixer->jmix::operator[](i)’, имеющего не классовый тип ‘channel'
PM MAIL   Вверх
mes
Дата 20.2.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



значит походу еще чего то изменили, чего нам не показали..
вот Ваш укороченный пример - все компилится  - так что ищете что где не так изменяли
Код

#include <iostream>
#include <vector>
using namespace std;

class jmix
{
public:
    jmix() {};
    ~jmix() {};
    struct channel{
        string name;
    };
    channel* operator[] (unsigned i) {
        return channels[i];
    }
private:
    vector<channel*> channels;
};

void SetTitle(const string&)
{}
int main()
{
   jmix * mixer= new jmix();

   SetTitle ((*mixer)[5]->name);

   system ("pause");
}




Это сообщение отредактировал(а) mes - 20.2.2009, 20:54


--------------------
PM MAIL WWW   Вверх
izoomer
Дата 24.2.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Цитата(mes @ 20.2.2009,  16:26)
значит походу еще чего то изменили, чего нам не показали..
вот Ваш укороченный пример - все компилится  - так что ищете что где не так изменяли
Код

#include <iostream>
#include <vector>
using namespace std;

class jmix
{
public:
    jmix() {};
    ~jmix() {};
    struct channel{
        string name;
    };
    channel* operator[] (unsigned i) {
        return channels[i];
    }
private:
    vector<channel*> channels;
};

void SetTitle(const string&)
{}
int main()
{
   jmix * mixer= new jmix();

   SetTitle ((*mixer)[5]->name);

   system ("pause");
}



Странно конечно, но почему то прямая инструкция (*mixer)[i].name ругается так же , а когда делаю:
Код

channel * m_channel = (*mixer)[i];
string name = m_channel.name;

то все ок .
В чем разница ?
PM MAIL   Вверх
mes
Дата 24.2.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(izoomer @  24.2.2009,  10:45 Найти цитируемый пост)
но почему то прямая инструкция (*mixer)[i].name ругается так же

а не пробовали поставить "->" вместо точки ?  smile 

Цитата(izoomer @  24.2.2009,  10:45 Найти цитируемый пост)
а когда делаю: 
Код

channel * m_channel = (*mixer)[i];
string name = m_channel.name;
то все ок .

Ничего не напутали ?


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.