Инициализировать статические переменные объекты одинаковым значением

Я хочу инициализировать все статические переменные объекты одним и тем же значением. У меня есть класс, определенный в prog1.h

  namespace fal {
    class read_f{
    public:
        static std::string ref_content, seq_content;
        int read_fasta(int argc, char **argv);
    };
}

И я пробовал инициализировать их в prog1.cpp

std::string fal::read_f::ref_content = seq_content = "";

Но у меня undefined reference error.

Когда я пытаюсь

std::string fal::read_f::ref_content = "" ;
std::string fal::read_f::seq_content = "";

работает нормально.

Как я могу инициализировать в одну строку?

ну, вы также не можете сделать int a = b = 10, если вы не объявили b

JoshKisb 29.03.2018 09:17

@JoshKisb - это не a и b, определенные в классе.

Agaz Wani 29.03.2018 09:20

@AaghazHussain std::string fal::read_f::ref_content = seq_content = ""; не определяет seq_content (который является источником вашей проблемы). Ваш класс содержит только объявления.

Algirdas Preidžius 29.03.2018 09:21

@ AlgirdasPreidžius Вы имеете в виду, что std::string fal::read_f::ref_content , seq_content ; ref_content = seq_content = ""; должен работать.

Agaz Wani 29.03.2018 09:23

они не объявлены в классе. вот почему, если вы попытаетесь присвоить им значение без глобальной инициализации, вы получите ошибки, потому что они не существуют

JoshKisb 29.03.2018 09:23
std::string fal::read_f::ref_content = "", fal::read_f::seq_content = "";
Yola 29.03.2018 09:25

@Yola Можно ли без повторения fal::read_f:: каждый раз, когда у меня десятки переменных.

Agaz Wani 29.03.2018 09:27

Вы пробовали std :: string fal :: read_f :: ref_content, seq_content = ""; ?

Clint 29.03.2018 09:31

Можете ли вы использовать C++ 17? Если да, то можете сделать их inline.

Rakete1111 29.03.2018 09:32

Если вы не входите в свой класс, вы должны указать область действия переменной, прежде чем использовать ее. У вас может быть seq_content вне вашего класса, как компилятор тогда узнает, на какой из них вы ссылаетесь?

HangrY 29.03.2018 09:32

Думаю, нет, но можно использовать using.

Yola 29.03.2018 09:34

@JoshKisb Пожалуйста, по крайней мере, прочтите вопрос перед тем, как комментировать. 1) Они объявлены в классе. 2) Ошибка не в том, что поля не существуют, а в том, что они не определены.

Algirdas Preidžius 29.03.2018 09:35

Боже, я пытаюсь объяснить именно эту проблему, но вы не слушаете. статические переменные класса должны быть инициализированы вне класса, иначе они не существуют

JoshKisb 29.03.2018 09:36

@AaghazHussain Дело в том, что ref_content = seq_content = ""; - это назначение, а не инициализация в контексте, в котором вы его написали, поэтому его нельзя записать в глобальной области.

Algirdas Preidžius 29.03.2018 09:36

В разделе $ 9.4.2 / 7 стандарта C++ говорится, что статические элементы данных инициализируются и уничтожаются точно так же, как нелокальные объекты (3.6.2, 3.6.3).

JoshKisb 29.03.2018 09:41

@JoshKisb Вы, кажется, сбиваете с толку терминологию. 1) Вы указали "они не объявлены в классе", но это явно неверно: они есть. 2) Терминология «вы получите ошибки, потому что их не существует» неоднозначна, так как она ближе к значению use of undeclared identifier. Тем не менее, компилятор прекрасно скомпилирует такой код. Только компоновщик не работает из-за отсутствия определений (термин, который вы даже не упомянули).

Algirdas Preidžius 29.03.2018 09:44

@ AlgirdasPreidžius ооооо, ты, должно быть, прав. мой английский, должно быть, помешанный. но рад, что ты понял, о чем я, мой парень. когда его нет, тогда нет необходимости в ошибках. плюс его инициализация, а не присвоение

JoshKisb 29.03.2018 09:47

@JoshKisb Вы снова комментируете то, что не читали. 1) Я не упомянул термин «назначение» в своем комментарии к вам, поэтому я должен сделать вывод, что вы имеете в виду мой комментарий к OP. 2) Вы читали комментарий, на который я отвечал? Я имел в виду фрагмент из следующего примера: std::string fal::read_f::ref_content , seq_content ; ref_content = seq_content = ""; Поскольку ref_content = seq_content = ""; является отдельным оператором - это больше не инициализация, а в данном контексте присвоение.

Algirdas Preidžius 29.03.2018 10:08

@ Rakete1111 Я использую c++17

Agaz Wani 29.03.2018 10:19

@ AlgirdasPreidžius, и при чем тут это вообще. ты просто отвечаешь мне, чтобы привлечь мое внимание. я занятой человек мой парень

JoshKisb 29.03.2018 10:49

@JoshKisb 1) Вы "поправили" меня, очевидно, неверным утверждением. Поскольку мне не нравится, что вы распространяете дезинформацию, имеющую отношение ко мне, я указал, почему ваше утверждение неверно. С моей точки зрения: это ваше намерение привлечь внимание из-за намеренного предоставления неверной информации. 2) Если бы вы были действительно заняты - вы бы не удосужились написать такой комментарий.

Algirdas Preidžius 29.03.2018 14:34

@ AlgirdasPreidžius, я не знаю, что заставило вас подумать, что я поправляю вас. я был явно согласен с тобой

JoshKisb 29.03.2018 16:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
22
63
1

Ответы 1

Вы вставляете их через запятую. Если вы не хотите повторять квалификатор fal::, вы можете использовать объявление using:

using fal::read_f;
std::string read_f::ref_content = "", read_f::seq_content = "";

Кроме того, начиная с C++ 17, вы можете сделать эти две переменные inline, так что они будут может быть определено в определении класса ([class.static.data]).

Это лучшая ставка, которую мы можем иметь?

Agaz Wani 29.03.2018 10:27

@AaghazHussain Я думаю, что это лучше всего, кроме того, что вы можете определить переменную для "", вы ничего не можете сделать, потому что слева от оператора = вам нужно иметь lvalue, но без предварительных определений эти имена не оценивают объекты, битовое поле или функции, поэтому они не являются glvalue и, следовательно, не lvalue.

Yola 29.03.2018 10:41

Другие вопросы по теме