2 / 2 / 0
Регистрация: 21.01.2015
Сообщений: 90
1

Как использовать вектор, содержащий указатели на класс, в этом же классе?

21.01.2015, 21:23. Показов 1523. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возникла необходимость обращения к объекту класса внутри класса с помощью вектора, содержащего указатели на объекты этого класса.
Ругается на строчки 50 - 52:
error C2227: left of '->getnumber' must point to class/struct/union/generic type
error C2065: 'Layers' : undeclared identifier

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <vector>
using namespace std;
int n;
 
class Triangle
{
    vector<int> triangle;
public:
    Triangle()
    {
        triangle.push_back(1);
        triangle.push_back(1);
        triangle.push_back(1);
        int amount = 2;
 
        for (int i = 2; i < n; ++i) 
        {
            triangle.push_back(1);
            for(int m = 0; m < i-1; ++m)            // i = текущая строчка
            {
                triangle.push_back(triangle[amount - i + 1 + m] + triangle[amount - i + 2 + m]);
            }
            triangle.push_back(1);
            amount += i + 1;
        }
    };
int getnumber(int str, int num )   // индексы (от 0)
    {
        return (str^2 + str)/2 + num;
    }
};
 
class Layer
{
private:
    int Lay;
    vector <int> num;
    Triangle* ptriangle;
public:
    Layer (int lay, Triangle* p): Lay(lay), ptriangle(p)
    {
        for (int i = 0; i <= Lay; ++i)
        {
            num.push_back(ptriangle -> getnumber(Lay,i));
 
            for (int n = 1; n < i; ++n) // "заполнение дыр"
            {
                int number = 0;
                number += Layers[Lay - 1] -> getnumber(i-1,n-1);
                number += Layers[Lay - 1] -> getnumber(i-1,n);
                number += Layers[Lay - 1] -> getnumber(i,n);
                num.push_back(number);
            }
 
            if (i > 0)
            num.push_back(ptriangle -> getnumber(Lay,i));
        }
 
    };
 
    int getnumber(int str, int num)
    {
        return (str^2 + str)/2 + num;
    }
 
    void output()
    {
        for (int i = 0; i <= Lay; ++ i)
        {
            for (int n = Lay; n > i; --n) {cout << " ";}
            for (int n = 0; n <= i; ++n){cout << getnumber(i,n) << " ";}
            cout << endl;
        }
    }
};
 
vector<Layer*> Layers;
 
void main()
{
    cout << "Enter n = ";
    //cin >> n;
    n = 2;
 
    Triangle* ptriangle = new Triangle();
 
    for (int i = 0; i < n; ++i)
        Layers.push_back(new Layer(i, ptriangle));
 
    Layers[2] -> output();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2015, 21:23
Ответы с готовыми решениями:

Реализовать класс для матриц. В этом классе реализовать интерфейс, содержащий методы для выполнения операций
Реализовать класс для матриц. В этом классе реализовать интерфейс, содержащий методы для выполнения...

Как использовать класс в классе?
class db { ...... function query($string) { $result = mysql_query($string) or die(&quot;Query...

Указатели в базовом классе на базовый класс и производный класс
Пишу контейнер &quot;Бинарное дерево поиска&quot; для частотного словаря. С самим контейнером особо...

Класс и конструктор с string или как использовать указатели.
Есть такая вот ерунда class human { public: string name; string surname; int age;...

7
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2015, 21:52 2
первичная ошибка: error C2065: 'Layers' : undeclared identifier
в месте использования неизвестно, что такое Layers. поэтому нужно перетащить чуть выше:


C++
1
2
3
4
5
6
7
8
9
10
11
...
 
class Layer;
vector<Layer*> Layers;
 
class Layer
{
  ...
};
 
...
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
21.01.2015, 22:00 3
Лучший ответ Сообщение было отмечено Niko Demin как решение

Решение

По сути, главная ошибка из-за этого и есть: Layers при объявлении класса еще не существует.
Разнесите реализацию и определение класса на части.
C++
1
2
3
4
5
6
7
8
9
10
class Layer
{
    int Lay;
    vector <int> num;
    Triangle* ptriangle;
public:
    Layer (int lay, Triangle* p);
    inline int getnumber(int str, int num) const;
    inline void output();
};
потом определите вектор Layers
C++
1
vector<Layer*> Layers;
А уже затем только - реализации методов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Layer::Layer(int lay, Triangle *p): Lay(lay), ptriangle(p)
{
   ....
}
 
inline int Layer::getnumber(int str, int num) const
{
    ...
}
 
inline void Layer::output()
{
   ....
}
Кстати. Вы уверены, что тут именно то, что вы хотите - xor от "str + 2"?
Цитата Сообщение от Niko Demin Посмотреть сообщение
str^2 + str
И вообще, уверены, что здесь нужен xor, а не pow ?

Добавлено через 53 секунды
Цитата Сообщение от DU2 Посмотреть сообщение
поэтому нужно перетащить чуть выше
вроде же для подобного объявления компилятору требуется знать, что включает в себя этот самый класс, разве нет?
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.01.2015, 22:09 4
для работы с указателями компилятору не надо знать определения класса, на который указывает
указатель. ну для вектора это верно. он не вызывает методы через указатель. а вот обращения
к методам класса внутри класса уже уместны. все определено.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.01.2015, 08:01 5
KOPOJI, inline имеет смысл указывать только при реализации метода вне класса. Упоминание его в объявлении класса привносит лишнюю информацию, которая не нужна для понимания интерфейса класса.
0
KOPOJI
22.01.2015, 09:58
  #6

Не по теме:

Tulosba, копипаст, поленился удалять.. Да и не уверен, что тот же output стоит делать inline

0
Tulosba
22.01.2015, 11:01
  #7

Не по теме:

Цитата Сообщение от KOPOJI Посмотреть сообщение
копипаст, поленился удалять.. Да и не уверен, что тот же output стоит делать inline
Но видимо не с кода ТС (у него нет inline). inline в любом случае лишь рекомендация компилятору. Но я хотел сделать акцент на другом: что inline - это деталь реализации, поэтому даже если он указан, это должно быть исключительно в реализации, а не в объявлении класса.

0
KOPOJI
22.01.2015, 11:02     Как использовать вектор, содержащий указатели на класс, в этом же классе?
  #8

Не по теме:

нет, не с кода ТС. С окна ввода на форуме - вынес реализацию, а затем скопировал и удалил "Layer::", про inline забыл :) Ну я понял, про что вы говорили :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2015, 11:02

Как использовать значения в классе через еще один класс?
как передать значения через класс моней в класс фракшн? using System; using...

можно ли создать указатель на класс в этом же классе?
у меня проблема: я пытаюсь создать динамический массив путем задания класса(в моём случае запись не...

Зачем учить указатели, если можно использовать вектор?
Не могу понять, зачем учить указатели если в большинстве случаев для выделения памяти намного...

Задачка: Создал класс SuperArray , в этом классе нужно создать массив длиной 5...
Привет всем!!! Не могу решить задачку, кто может подскажите.... Создал класс SuperArray , в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru