Класс в классе или непонятный доступ к данным.
От: Аноним  
Дата: 01.10.05 23:04
Оценка:
Еррор в данном месте меня привел к шоку, такого я не ожидал... вроде бы как Any находится по иерархии в One, а
значит и должен знать о всех переменных One.


class One
{
public:
    int var;

    class Any
    {
    public:
        void func();
    };

    Any x;

};

class Two: public One
{
};

void Two::Any::func()
{
    // Как получить доступ к var ??????

    // var = 0;  //error C2327: 'One::var' : is not a type name, static, or enumerator
                 //error C2065: 'var' : undeclared identifier


    // One::var = 0;  //error C2597: illegal reference to non-static member 'One::var'
}
void main()
{

}
Re: Класс в классе или непонятный доступ к данным.
От: IROV..  
Дата: 01.10.05 23:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Еррор в данном месте меня привел к шоку, такого я не ожидал... вроде бы как Any находится по иерархии в One, а

А>значит и должен знать о всех переменных One.


А>
А>class One
А>{
А>public:
А>    int var;

А>    class Any
А>    {
А>    public:
А>        void func();
А>    };

А>    Any x;

А>};

А>class Two: public One
А>{
А>};

А>void One::Any::func()
А>{
А>    // Как получить доступ к var ??????

А>    // var = 0;  //error C2327: 'One::var' : is not a type name, static, or enumerator
А>                 //error C2065: 'var' : undeclared identifier


А>    // One::var = 0;  //error C2597: illegal reference to non-static member 'One::var'
А>}
А>void main()
А>{

А>}

А>
я не волшебник, я только учусь!
Re: Класс в классе или непонятный доступ к данным.
От: __LP  
Дата: 01.10.05 23:35
Оценка:
Здравствуйте, Аноним, Вы писали:

Дело не в доступе к данным. Чтобы обратиться к нестатическим членам нужен объект этого класса, если обращение происходит в функции другого класса obj.var

P.S. main должна возвращать int
C++ можно выучить за 21 день! ...если дни — полярные.
Re: Класс в классе или непонятный доступ к данным.
От: zoleg Россия  
Дата: 01.10.05 23:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Еррор в данном месте меня привел к шоку, такого я не ожидал... вроде бы как Any находится по иерархии в One, а

А>значит и должен знать о всех переменных One.

Знать то он знает (у тебя там все public), но похоже что проблема тут совсем в другом... В непонимании, что такое
объявление класса внутри другого класса. Это совсем не означает что, в данном случае Any, становится чемто вроде
вложенной функции в паскале. Просто Any находится в определенном пространстве имен и больше ничего.

Если нужно всетаки получить доступ к var, то в Any нужно както передать ссылку на объект One (либо в конструкторе,
либо как параметр func).
Re[2]: Класс в классе или непонятный доступ к данным.
От: Аноним  
Дата: 02.10.05 19:40
Оценка:
Z>Если нужно всетаки получить доступ к var, то в Any нужно както передать ссылку на объект One (либо в конструкторе,
Z>либо как параметр func).

Во дурак я, и впрямь несложно и элегантно сейчас попробую, спасибо что подсказали
Re[3]: Класс в классе или непонятный доступ к данным.
От: Аноним  
Дата: 02.10.05 19:56
Оценка:
Здравствуйте, Аноним, Вы писали:

Z>>Если нужно всетаки получить доступ к var, то в Any нужно както передать ссылку на объект One (либо в конструкторе,

Z>>либо как параметр func).

А>Во дурак я, и впрямь несложно и элегантно сейчас попробую, спасибо что подсказали


Хотя нет, такой способ не подойдет, ведь если создать указатель на класс One, то переменная var будет использоваться из копии класса а не из того что мне нужно. Черт, как это сказать, короче такой способ не годится
Re[4]: Класс в классе или непонятный доступ к данным.
От: Аноним  
Дата: 02.10.05 20:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


Z>>>Если нужно всетаки получить доступ к var, то в Any нужно както передать ссылку на объект One (либо в конструкторе,

Z>>>либо как параметр func).

А>>Во дурак я, и впрямь несложно и элегантно сейчас попробую, спасибо что подсказали


А>Хотя нет, такой способ не подойдет, ведь если создать указатель на класс One, то переменная var будет использоваться из копии класса а не из того что мне нужно. Черт, как это сказать, короче такой способ не годится


Вот что я хотел сказать,
Two classTwo;
classTwo.Func(); // Func должно менять значение именно One::var а не какого либо друго обьекта One
Re[5]: Класс в классе или непонятный доступ к данным.
От: Аноним  
Дата: 02.10.05 20:07
Оценка:
Вот что я хотел сказать,( просто лень региться и постоянно ошибки нахожу, этот вариант правильный)
Two classTwo;
classTwo.Func(); // Func должно менять значение именно classTwo.var а не какого либо друго обьекта One
Re: Класс в классе или непонятный доступ к данным.
От: Аноним  
Дата: 02.10.05 21:05
Оценка:
Вообще-то это и не должно компилироваться.
В каком-то смысле то, что ты написал, эквивалентно следущему:
class Any
{
public:
  void func();
};

class One
{
public:
 int var;

 Any x;
};

void Any::func()
{
    // var = 0;  было бы странно, если var был бы тут доступен  ;) 
}


Как вариант можешь сделать примерно так:

// forward declaration of the class One
class One;

class Any
{
public:

  // constructor
  Any(One *pOne): m_pOne(pOne) {};

  void func()
  {
    m_pOne->var = 0;
  }
  
private:
  One *m_pOne;
};

class One
{
public:
  // constructor
  One(): x(this) {};

 int var;
 Any x;
};

Если опишешь свою проблему, то помогут найти более элегантное решение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.