Ответ 1
Что вы можете сделать, это объявить строку в заголовке и инициализировать ее в вашем .cpp.
в MyClass.h
#include <string>
class MyClass
{
static std::string foo;
}
в MyClass.cpp
#include "MyClass.h"
std::string MyClass::foo = "bar"
Я пытаюсь создать статическую строку в моем классе: (в моем файле заголовка)
static string description = "foo";
но я получаю эту ошибку:
IntelliSense: a member with an in-class initializer must be const
если я изменю его на это:
static const string description = "foo";
Я получаю эту ошибку вместо:
IntelliSense: a member of type "const std::string" cannot have an in-class initializer
Что я сделал не так?
Что вы можете сделать, это объявить строку в заголовке и инициализировать ее в вашем .cpp.
в MyClass.h
#include <string>
class MyClass
{
static std::string foo;
}
в MyClass.cpp
#include "MyClass.h"
std::string MyClass::foo = "bar"
Игнорируя конкретное сообщение об ошибке, основная проблема заключается в том, что вы пытаетесь инициализировать атрибут статического члена в объявлении, в то время как в общем случае это должно быть сделано в определении.
// header
struct test {
static std::string x;
};
// single cpp
std::string test::x = "foo";
Теперь вернитесь к сообщениям об ошибках. В стандарте С++ 03 есть исключение, которое позволяет предоставить инициализатору объявление константного интегрального типа, так что это значение может быть видимым во всех единицах трансляции, которые включают заголовок, и поэтому могут использоваться как константное выражение
// header
struct test {
static const int size = 10;
};
// some translation unit can do
struct A {
int array[test::size];
};
Если значение было определено в определении переменной, то компилятор мог использовать его только в этой единице перевода. Кажется, что ваш компилятор выполняет два теста: один для константы и отдельный для неотъемлемой части и, следовательно, два сообщения об ошибках.
Еще одна вещь, которая может повлиять на этот проект в компиляторе, заключается в том, что стандарт С++ 11 допускает инициализаторы в объявлении нестатических членов класса, которые затем будут использоваться в списке инициализаторов каждого конструктора, который делает не укажите значение для этого поля:
struct test {
int a = 10;
int b = 5;
test() : a(5) // b(5) implicitly generated
{}
};
Это не связано с вашей конкретной проблемой, так как ваш член статичен, но, вероятно, объясняет, почему тесты в компиляторе были разделены, как есть.
Отделите декларацию от определения. В файле заголовка сделайте следующее:
static string description;
И затем точно в одну единицу перевода (один файл CPP) сделайте следующее:
string type::description = "foo";
Я не знаю, что именно нужно между статическим членом и постоянным членом. Статический член будет связан с самим классом, а не с экземплярами, а постоянный член связан с экземпляром и будет постоянным.
Однако это возможный дубликат this
Привет