Могу ли я объявить строку в файле заголовка в определении класса?

можно ли объявить строку в заголовке (.H-файл), в определении класса?

когда я хочу установить по умолчанию int, Я:

 class MyClass
 {
     static const unsigned int kDATA_IMAGE_WIDTH =  1024;

есть ли способ сделать то же самое для

5 ответов


из сообщения об ошибке, которое вы дали (акцент мой):

ошибка: неверный в классе инициализация статического элемента данных неинтегрированного типа 'const std:: string'

вы можете сделать это в заголовочный файл, но вы не можете сделать это в классе.

что есть:

class MyClass
{
    static const std::string invalid = "something";
};

недопустимо, но

static const std::string valid = "something else";

действителен.

Если вы хотите, чтобы статика была только членом класса, вы делаете это:

//Header
class MyClass
{
    static const std::string valid;
};


//Implementation (.cpp) file

const std::string MyClass::valid = "something else again";

только статический const Интеграл переменные класса могут быть инициализированы с помощью "= постоянный" синтаксис.


да, но строки не являются внутренними для C++. вам нужен правильный #include

#include <string>

static const std::string kDEFAULT_FILE_EXTENSION = "png";

на боковой ноте. Я никогда не видел, чтобы код c++ использовал префикс k для обозначения константы. Я думаю, что это конвенция Objective-C. Кроме того, символы ALL_CAPS должны быть зарезервированы для макросов #define, а не для языковых констант.


Да, вы должны иметь возможность объявлять строки или помещать любой другой код в файл заголовка. Это может быть сбой, потому что в заголовочном файле отсутствует #include, который определяет строку, или вам нужно поместить "std::" перед ним, если вы не "используете пространство имен std" в заголовочном файле.

пожалуйста, обновите свой вопрос с конкретной ошибкой компилятора, которую вы видите, если эти предложения не исправить. Надеюсь, это поможет.


У меня нет контекста здесь, но если цель состоит в том, чтобы определить неизменяемый массив символов, завершенный "\0", почему бы не использовать:

static const char kDEFAULT_FILE_EXTENSION [] = "png";

кроме того, обратите внимание, что нет прозрачного преобразования между классом string и const char * без вызова string::c_str()..


два варианта:

определите функцию в заголовке, которая является статической и возвращает нужную строку.

static std::string kDEFAULT_FILE_EXTENSION()
    {
        return "png";
    }

макрос будет делать правильную вещь здесь

#define STATIC_STRING_IN_HEADER(name,value) static std::string name(){return value;}
STATIC_STRING_IN_HEADER(kDEFAULT_FILE_EXTENSION,"png")