Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
#1

Статическое поле - C++

29.07.2009, 21:25. Просмотров 1572. Ответов 6
Метки нет (Все метки)

Помогите с такой проблемой.
Программа нормально компилится, но возвращается, вот такая ошибка при объявлении
статического поля, являющегося указателем на массив значений строк символов(char*) типа char.
Вот код:
Файл "Memory.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
#include "combinate.h"
 
class Memory :
    public Combinate
{
public:
    static char **ppValue; //указатель на массив значений входов объекта класса
public:
    Memory(int innum=3, int outnum=1);
    ~Memory();
};
Файл реализации "Memory.cpp"
C++
1
2
3
4
5
6
7
8
9
10
#include "Memory.h"
 
Memory::Memory(int innum, int outnum)
{
    ppValue=(char**)new char[innum+outnum][4];
}
Memory::~Memory()
{
    delete [] ppValue;
}

Ошибка такого вида:
error LNK2001: unresolved external symbol "public: static char * * Memory:pValue" (?ppValue@Memory@@2PAPADA)
Неразрешенный внешний символ: "public: static char * * Memory:pValue" (?ppValue@Memory@@2PAPADA)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2009, 21:25     Статическое поле
Посмотрите здесь:

C++ Одномерный массив, статическое выделение памяти, ошибка в объявлении
Статическое связывание параметров методов C++
C++ Статическое подключение DLL
C++ Статическое поле класса, имеющее тип того же класса
Статическое поле,количество экземпляров класса C++
C++ Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
Друзья, подскажите, как в классе создать константное поле, ссылочное поле и объектное поле? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 21:31     Статическое поле #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В заголовочном файле происходит всего лишь декларация обьекта, память под сам объект не выделяется. для того, чтобы это произошло, статическое поле должно быть обьявлено в единице трансляции.

// Memory.cpp
char** Memory::ppValue = NULL;
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
29.07.2009, 21:57  [ТС]     Статическое поле #3
Цитата Сообщение от Rififi Посмотреть сообщение
В заголовочном файле происходит всего лишь декларация обьекта, память под сам объект не выделяется. для того, чтобы это произошло, статическое поле должно быть обьявлено в единице трансляции.

// Memory.cpp
char** Memory:pValue = NULL;
В таком случае компилируется и собирается нормально:
Файл "Memory.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
#include "combinate.h"
 
class Memory :
    public Combinate
{
public:
    char **ppValue;  //указатель на массив значений входов объекта класса
public:
    Memory(int innum=3, int outnum=1);
    ~Memory();
};
C++
1
2
3
4
5
6
7
8
9
10
11
#include "Memory.h"
 
Memory::Memory(int innum, int outnum)
{
    Memory::ppValue=0;
    ppValue=(char**)new char[innum+outnum][4];
}
Memory::~Memory()
{
    delete [] ppValue;
}
При объявление модификатора static в "Memory.h" ошибка остается.
В связи с этим вопрос, является ли это поле статическим?
C++
1
2
public:
    char **ppValue;  //указатель на массив значений входов объекта класса
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 22:00     Статическое поле #4
в первом случае у тебя статическое поле (одно на все экземпляры классов, которые когда либо будут созданы), во втором - каждый класс имеет свой собственный ppValue. разницу чуеш?
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
29.07.2009, 22:12  [ТС]     Статическое поле #5
Цитата Сообщение от Rififi Посмотреть сообщение
в первом случае у тебя статическое поле (одно на все экземпляры классов, которые когда либо будут созданы), во втором - каждый класс имеет свой собственный ppValue. разницу чуеш?
Если объявить с модификатором static и в файле "memory.cpp"
Файл "Memory.h"
C++
1
static char **ppValue;
C++
1
Memory::ppValue=0;
Не решение проблемы, так не собирается проект.
Неразрешенный внешний символ: "public: static char * * MemoryValue" (?ppValue@Memory@@2PAPADA)
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 22:45     Статическое поле #6
здесь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2009, 22:53     Статическое поле
Еще ссылки по теме:

Статическое приведение типов C++
Статическое подключение системных DLL-файлов C++
C++ Статическое объявление матрицы
Почему метод класса затирает статическое поле C++
Динамическое и статическое выделение памяти C++

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

Или воспользуйтесь поиском по форуму:
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
29.07.2009, 22:53  [ТС]     Статическое поле #7
Цитата Сообщение от Rififi Посмотреть сообщение
В заголовочном файле происходит всего лишь декларация обьекта, память под сам объект не выделяется. для того, чтобы это произошло, статическое поле должно быть обьявлено в единице трансляции.

// Memory.cpp
char** Memory:pValue = NULL;
Просто не сразу понял, что определение должно быть объявлено вне функций спс.
Yandex
Объявления
29.07.2009, 22:53     Статическое поле
Ответ Создать тему
Опции темы

Текущее время: 04:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru