Я хочу инициализировать все статические переменные объекты одним и тем же значением. У меня есть класс, определенный в 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 = "";
работает нормально.
Как я могу инициализировать в одну строку?
@JoshKisb - это не a и b, определенные в классе.
@AaghazHussain std::string fal::read_f::ref_content = seq_content = ""; не определяет seq_content (который является источником вашей проблемы). Ваш класс содержит только объявления.
@ AlgirdasPreidžius Вы имеете в виду, что std::string fal::read_f::ref_content , seq_content ; ref_content = seq_content = ""; должен работать.
они не объявлены в классе. вот почему, если вы попытаетесь присвоить им значение без глобальной инициализации, вы получите ошибки, потому что они не существуют
std::string fal::read_f::ref_content = "", fal::read_f::seq_content = "";@Yola Можно ли без повторения fal::read_f:: каждый раз, когда у меня десятки переменных.
Вы пробовали std :: string fal :: read_f :: ref_content, seq_content = ""; ?
Можете ли вы использовать C++ 17? Если да, то можете сделать их inline.
Если вы не входите в свой класс, вы должны указать область действия переменной, прежде чем использовать ее. У вас может быть seq_content вне вашего класса, как компилятор тогда узнает, на какой из них вы ссылаетесь?
Думаю, нет, но можно использовать using.
@JoshKisb Пожалуйста, по крайней мере, прочтите вопрос перед тем, как комментировать. 1) Они объявлены в классе. 2) Ошибка не в том, что поля не существуют, а в том, что они не определены.
Боже, я пытаюсь объяснить именно эту проблему, но вы не слушаете. статические переменные класса должны быть инициализированы вне класса, иначе они не существуют
@AaghazHussain Дело в том, что ref_content = seq_content = ""; - это назначение, а не инициализация в контексте, в котором вы его написали, поэтому его нельзя записать в глобальной области.
В разделе $ 9.4.2 / 7 стандарта C++ говорится, что статические элементы данных инициализируются и уничтожаются точно так же, как нелокальные объекты (3.6.2, 3.6.3).
@JoshKisb Вы, кажется, сбиваете с толку терминологию. 1) Вы указали "они не объявлены в классе", но это явно неверно: они есть. 2) Терминология «вы получите ошибки, потому что их не существует» неоднозначна, так как она ближе к значению use of undeclared identifier. Тем не менее, компилятор прекрасно скомпилирует такой код. Только компоновщик не работает из-за отсутствия определений (термин, который вы даже не упомянули).
@ AlgirdasPreidžius ооооо, ты, должно быть, прав. мой английский, должно быть, помешанный. но рад, что ты понял, о чем я, мой парень. когда его нет, тогда нет необходимости в ошибках. плюс его инициализация, а не присвоение
@JoshKisb Вы снова комментируете то, что не читали. 1) Я не упомянул термин «назначение» в своем комментарии к вам, поэтому я должен сделать вывод, что вы имеете в виду мой комментарий к OP. 2) Вы читали комментарий, на который я отвечал? Я имел в виду фрагмент из следующего примера: std::string fal::read_f::ref_content , seq_content ; ref_content = seq_content = ""; Поскольку ref_content = seq_content = ""; является отдельным оператором - это больше не инициализация, а в данном контексте присвоение.
@ Rakete1111 Я использую c++17
@ AlgirdasPreidžius, и при чем тут это вообще. ты просто отвечаешь мне, чтобы привлечь мое внимание. я занятой человек мой парень
@JoshKisb 1) Вы "поправили" меня, очевидно, неверным утверждением. Поскольку мне не нравится, что вы распространяете дезинформацию, имеющую отношение ко мне, я указал, почему ваше утверждение неверно. С моей точки зрения: это ваше намерение привлечь внимание из-за намеренного предоставления неверной информации. 2) Если бы вы были действительно заняты - вы бы не удосужились написать такой комментарий.
@ AlgirdasPreidžius, я не знаю, что заставило вас подумать, что я поправляю вас. я был явно согласен с тобой





Вы вставляете их через запятую. Если вы не хотите повторять квалификатор fal::, вы можете использовать объявление using:
using fal::read_f;
std::string read_f::ref_content = "", read_f::seq_content = "";
Кроме того, начиная с C++ 17, вы можете сделать эти две переменные inline, так что они будут может быть определено в определении класса ([class.static.data]).
Это лучшая ставка, которую мы можем иметь?
@AaghazHussain Я думаю, что это лучше всего, кроме того, что вы можете определить переменную для "", вы ничего не можете сделать, потому что слева от оператора = вам нужно иметь lvalue, но без предварительных определений эти имена не оценивают объекты, битовое поле или функции, поэтому они не являются glvalue и, следовательно, не lvalue.
ну, вы также не можете сделать int a = b = 10, если вы не объявили b