m*********g 发帖数: 646 | |
r*******y 发帖数: 1081 | 2 和普通的initialize 没区别吧?
【在 m*********g 的大作中提到】 : 请问有什么好方法么?谢谢!
|
m*********g 发帖数: 646 | 3 那你给个例子?
【在 r*******y 的大作中提到】 : 和普通的initialize 没区别吧?
|
r*******y 发帖数: 1081 | 4 static vector v;
【在 m*********g 的大作中提到】 : 那你给个例子?
|
m*********g 发帖数: 646 | 5 你这是declare, 同学。我问的是initialize.
【在 r*******y 的大作中提到】 : static vector v;
|
r*******y 发帖数: 1081 | 6 it is initialization. try this
static vector v;
cout <
the output is 0, which means v is initialized with empty string.
【在 m*********g 的大作中提到】 : 你这是declare, 同学。我问的是initialize.
|
m*********g 发帖数: 646 | 7 我对你无语了。
你知道为什么要用一个static member么?你这有什么用?
【在 r*******y 的大作中提到】 : it is initialization. try this : static vector v; : cout <: the output is 0, which means v is initialized with empty string.
|
r*******y 发帖数: 1081 | 8 could you post your code to see what is wrong ?
I am confused too.
【在 m*********g 的大作中提到】 : 我对你无语了。 : 你知道为什么要用一个static member么?你这有什么用?
|
m*********g 发帖数: 646 | 9 that is because you have even NO idea/exp about static member, rt ?
【在 r*******y 的大作中提到】 : could you post your code to see what is wrong ? : I am confused too.
|
r*******y 发帖数: 1081 | 10 I will wait for other people's solution.
【在 m*********g 的大作中提到】 : that is because you have even NO idea/exp about static member, rt ?
|
|
|
S**I 发帖数: 15689 | 11 wrap it into another class and use an object of that class as static member
instead.
【在 m*********g 的大作中提到】 : 请问有什么好方法么?谢谢!
|
m*********g 发帖数: 646 | 12 Is any easier way possible?
member
【在 S**I 的大作中提到】 : wrap it into another class and use an object of that class as static member : instead.
|
S**I 发帖数: 15689 | 13 initialized as usual:
vector A::s(10, "");
【在 m*********g 的大作中提到】 : Is any easier way possible? : : member
|
m*********g 发帖数: 646 | 14 what if I want this static vector to store "ABC" "DEF" "GHI" ?
【在 S**I 的大作中提到】 : initialized as usual: : vector A::s(10, "");
|
S**I 发帖数: 15689 | 15 you can initialize an array, then use that array to initialize the vector:
string a[] = {"ABC", "DEF", "GHI"};
vector A::s(a, a+sizeof(a)/sizeof(a[0]));
【在 m*********g 的大作中提到】 : what if I want this static vector to store "ABC" "DEF" "GHI" ?
|
t****t 发帖数: 6806 | 16 now that's the correct way to ask question. initialize? with what? you have
to be specific. initialize with empty vector is initialize too, and it doesn
't matter whether you have static object or not.
experienced ppl may have guessed what you need, but most ppl won't.
now here is the answer. there is no decent way to do this in c++03. you may
define const char* array and initialize with it, but you add extra objects.
it's ugly and easy to make mistakes.
c++0x added std::initializer_list<>, which is exactly what you need.
【在 m*********g 的大作中提到】 : what if I want this static vector to store "ABC" "DEF" "GHI" ?
|
m*********g 发帖数: 646 | 17 I really don't want to argue with ppl on BBS. Ok, whatever you say.
I just assume ppl are experienced here, and know an empty static vector is
useless except showing some correct "book knowledge".
But thanks for your input. I know the way to use a static array but still it
helps, especially abt the c++OX.
have
doesn
may
.
【在 t****t 的大作中提到】 : now that's the correct way to ask question. initialize? with what? you have : to be specific. initialize with empty vector is initialize too, and it doesn : 't matter whether you have static object or not. : experienced ppl may have guessed what you need, but most ppl won't. : now here is the answer. there is no decent way to do this in c++03. you may : define const char* array and initialize with it, but you add extra objects. : it's ugly and easy to make mistakes. : c++0x added std::initializer_list<>, which is exactly what you need.
|
h********n 发帖数: 1671 | 18 向别人问问题起码要虚心一点,自己问的不清楚也不能责怪别人,别人来回答已经是很
热心了。
static变量可以用一个函数的返回值来初始化,可以任意复杂,也不限于class member
。但是复杂数据结构的static变量最好不要进行复杂的初始化。如果只是book
knowledge,最好是直接用char* array,不要用vector。如果必需要用有复杂
数据结构的static变量,最好是先缺省初始化为empty,然后在main()里动态的进行初
始化。
using namespace std;
struct A
{
static vector v;
static vector f(){ vector v; v.push_back("123"); v.push_back
("abc"); return v;}
};
vector A::v = A::f();
int main()
{
cout << A::v[0] << " " << A::v[1] << endl;
} |
m*********g 发帖数: 646 | 19 觉得动态的进行初始化这个做法会 confuse 别人,别人在用这个class的时候会不知道
它是什么,也许不是一个很好的design。
member
【在 h********n 的大作中提到】 : 向别人问问题起码要虚心一点,自己问的不清楚也不能责怪别人,别人来回答已经是很 : 热心了。 : static变量可以用一个函数的返回值来初始化,可以任意复杂,也不限于class member : 。但是复杂数据结构的static变量最好不要进行复杂的初始化。如果只是book : knowledge,最好是直接用char* array,不要用vector。如果必需要用有复杂 : 数据结构的static变量,最好是先缺省初始化为empty,然后在main()里动态的进行初 : 始化。 : using namespace std; : struct A : {
|
h**********c 发帖数: 4120 | 20 好像这样吧
some.h
class c {
static std::vector sv;
public:
}
some.cpp
std::vector c::sv ;
最少visual c++ 是这样,
如何解释呢,header 里的东西不会成为memory instance,只有cpp 里才可以。 |
|
|
h********n 发帖数: 1671 | 21 别人需要看的是声明,而不是定义。到.cpp里看定义才知道它是什么,这样更confuse
别人。
进入main()以后进行实质的初始化,可以保证这时所有变量都已经处在valid状态。你
这个例子用的都是库类型,还问题不大。如果某一天你换成了自己的string类,或者改
用自己的allocator,那这种静态初始化的用法就是一个定时炸弹,不知什么地方就有
可能会引用到一个还没有初始化的变量。
原则上static变量的初始状态都应该尽可能简单。把复杂的参数写进构造函数参数列表
,与用一个函数来初始化没有区别,因为构造函数也是一个函数,只是语法不同。
前面的几个答案里,初始化为empty的那个才是最好的design,有经验的人都会这样写
。其他几个答案不过是为了满足你这个奇怪的用法而凑出来的。
另一方面,如果你不打算进行动态修改的话,为什么要用vector?这时用char
*[]是最合理的。如果你打算在程序中进行动态修改的话,动态初始化自然也很正常。
【在 m*********g 的大作中提到】 : 觉得动态的进行初始化这个做法会 confuse 别人,别人在用这个class的时候会不知道 : 它是什么,也许不是一个很好的design。 : : member
|
l*********s 发帖数: 5409 | 22 Agree, bad practices are bad no matter how fancy codes look. Combo of C++ and full-of-oneself attitude is a perfect recipe for disasters.
confuse
【在 h********n 的大作中提到】 : 别人需要看的是声明,而不是定义。到.cpp里看定义才知道它是什么,这样更confuse : 别人。 : 进入main()以后进行实质的初始化,可以保证这时所有变量都已经处在valid状态。你 : 这个例子用的都是库类型,还问题不大。如果某一天你换成了自己的string类,或者改 : 用自己的allocator,那这种静态初始化的用法就是一个定时炸弹,不知什么地方就有 : 可能会引用到一个还没有初始化的变量。 : 原则上static变量的初始状态都应该尽可能简单。把复杂的参数写进构造函数参数列表 : ,与用一个函数来初始化没有区别,因为构造函数也是一个函数,只是语法不同。 : 前面的几个答案里,初始化为empty的那个才是最好的design,有经验的人都会这样写 : 。其他几个答案不过是为了满足你这个奇怪的用法而凑出来的。
|
l********e 发帖数: 34 | 23 是的,是这样的。
我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一
个copy.
如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
【在 h**********c 的大作中提到】 : 好像这样吧 : some.h : class c { : static std::vector sv; : public: : } : some.cpp : std::vector c::sv ; : 最少visual c++ 是这样, : 如何解释呢,header 里的东西不会成为memory instance,只有cpp 里才可以。
|
x****u 发帖数: 44466 | 24 对于C++来说,只有一种源文件。
所以你应该了解一下什么东西可以写多次,什么只能写一次。
【在 l********e 的大作中提到】 : 是的,是这样的。 : 我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一 : 个copy. : 如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
|
l********e 发帖数: 34 | 25 Could you elaborate a little bit for this problem?
【在 x****u 的大作中提到】 : 对于C++来说,只有一种源文件。 : 所以你应该了解一下什么东西可以写多次,什么只能写一次。
|
x****u 发帖数: 44466 | 26 实体只能define一次,但是可以declare多次。
【在 l********e 的大作中提到】 : Could you elaborate a little bit for this problem?
|
t****t 发帖数: 6806 | 27 c++ 标准显然没有禁止过这回事. 一般的说, 建议不要在头文件里定义对象, 这是对的.
【在 l********e 的大作中提到】 : 是的,是这样的。 : 我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一 : 个copy. : 如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
|
h********n 发帖数: 1671 | 28 补充一点,static的或是unnamed namespace中的全局变量可以定义在头文件中,当然
不建议这样做。整数类型的static const没问题。template的static变量和inline函数
当中的static变量,就只能定义在头文件中了。
其它情况,不是被多次初始化的风险,而是无法链接。
【在 l********e 的大作中提到】 : 是的,是这样的。 : 我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一 : 个copy. : 如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
|
l********e 发帖数: 34 | 29 受教了。
【在 h********n 的大作中提到】 : 补充一点,static的或是unnamed namespace中的全局变量可以定义在头文件中,当然 : 不建议这样做。整数类型的static const没问题。template的static变量和inline函数 : 当中的static变量,就只能定义在头文件中了。 : 其它情况,不是被多次初始化的风险,而是无法链接。
|
m*********g 发帖数: 646 | |
|
|
r*******y 发帖数: 1081 | 31 和普通的initialize 没区别吧?
【在 m*********g 的大作中提到】 : 请问有什么好方法么?谢谢!
|
m*********g 发帖数: 646 | 32 那你给个例子?
【在 r*******y 的大作中提到】 : 和普通的initialize 没区别吧?
|
r*******y 发帖数: 1081 | 33 static vector v;
【在 m*********g 的大作中提到】 : 那你给个例子?
|
m*********g 发帖数: 646 | 34 你这是declare, 同学。我问的是initialize.
【在 r*******y 的大作中提到】 : static vector v;
|
r*******y 发帖数: 1081 | 35 it is initialization. try this
static vector v;
cout <
the output is 0, which means v is initialized with empty string.
【在 m*********g 的大作中提到】 : 你这是declare, 同学。我问的是initialize.
|
m*********g 发帖数: 646 | 36 我对你无语了。
你知道为什么要用一个static member么?你这有什么用?
【在 r*******y 的大作中提到】 : it is initialization. try this : static vector v; : cout <: the output is 0, which means v is initialized with empty string.
|
r*******y 发帖数: 1081 | 37 could you post your code to see what is wrong ?
I am confused too.
【在 m*********g 的大作中提到】 : 我对你无语了。 : 你知道为什么要用一个static member么?你这有什么用?
|
m*********g 发帖数: 646 | 38 that is because you have even NO idea/exp about static member, rt ?
【在 r*******y 的大作中提到】 : could you post your code to see what is wrong ? : I am confused too.
|
r*******y 发帖数: 1081 | 39 I will wait for other people's solution.
【在 m*********g 的大作中提到】 : that is because you have even NO idea/exp about static member, rt ?
|
S**I 发帖数: 15689 | 40 wrap it into another class and use an object of that class as static member
instead.
【在 m*********g 的大作中提到】 : 请问有什么好方法么?谢谢!
|
|
|
m*********g 发帖数: 646 | 41 Is any easier way possible?
member
【在 S**I 的大作中提到】 : wrap it into another class and use an object of that class as static member : instead.
|
S**I 发帖数: 15689 | 42 initialized as usual:
vector A::s(10, "");
【在 m*********g 的大作中提到】 : Is any easier way possible? : : member
|
m*********g 发帖数: 646 | 43 what if I want this static vector to store "ABC" "DEF" "GHI" ?
【在 S**I 的大作中提到】 : initialized as usual: : vector A::s(10, "");
|
S**I 发帖数: 15689 | 44 you can initialize an array, then use that array to initialize the vector:
string a[] = {"ABC", "DEF", "GHI"};
vector A::s(a, a+sizeof(a)/sizeof(a[0]));
【在 m*********g 的大作中提到】 : what if I want this static vector to store "ABC" "DEF" "GHI" ?
|
t****t 发帖数: 6806 | 45 now that's the correct way to ask question. initialize? with what? you have
to be specific. initialize with empty vector is initialize too, and it doesn
't matter whether you have static object or not.
experienced ppl may have guessed what you need, but most ppl won't.
now here is the answer. there is no decent way to do this in c++03. you may
define const char* array and initialize with it, but you add extra objects.
it's ugly and easy to make mistakes.
c++0x added std::initializer_list<>, which is exactly what you need.
【在 m*********g 的大作中提到】 : what if I want this static vector to store "ABC" "DEF" "GHI" ?
|
m*********g 发帖数: 646 | 46 I really don't want to argue with ppl on BBS. Ok, whatever you say.
I just assume ppl are experienced here, and know an empty static vector is
useless except showing some correct "book knowledge".
But thanks for your input. I know the way to use a static array but still it
helps, especially abt the c++OX.
have
doesn
may
.
【在 t****t 的大作中提到】 : now that's the correct way to ask question. initialize? with what? you have : to be specific. initialize with empty vector is initialize too, and it doesn : 't matter whether you have static object or not. : experienced ppl may have guessed what you need, but most ppl won't. : now here is the answer. there is no decent way to do this in c++03. you may : define const char* array and initialize with it, but you add extra objects. : it's ugly and easy to make mistakes. : c++0x added std::initializer_list<>, which is exactly what you need.
|
h********n 发帖数: 1671 | 47 向别人问问题起码要虚心一点,自己问的不清楚也不能责怪别人,别人来回答已经是很
热心了。
static变量可以用一个函数的返回值来初始化,可以任意复杂,也不限于class member
。但是复杂数据结构的static变量最好不要进行复杂的初始化。如果只是book
knowledge,最好是直接用char* array,不要用vector。如果必需要用有复杂
数据结构的static变量,最好是先缺省初始化为empty,然后在main()里动态的进行初
始化。
using namespace std;
struct A
{
static vector v;
static vector f(){ vector v; v.push_back("123"); v.push_back
("abc"); return v;}
};
vector A::v = A::f();
int main()
{
cout << A::v[0] << " " << A::v[1] << endl;
} |
m*********g 发帖数: 646 | 48 觉得动态的进行初始化这个做法会 confuse 别人,别人在用这个class的时候会不知道
它是什么,也许不是一个很好的design。
member
【在 h********n 的大作中提到】 : 向别人问问题起码要虚心一点,自己问的不清楚也不能责怪别人,别人来回答已经是很 : 热心了。 : static变量可以用一个函数的返回值来初始化,可以任意复杂,也不限于class member : 。但是复杂数据结构的static变量最好不要进行复杂的初始化。如果只是book : knowledge,最好是直接用char* array,不要用vector。如果必需要用有复杂 : 数据结构的static变量,最好是先缺省初始化为empty,然后在main()里动态的进行初 : 始化。 : using namespace std; : struct A : {
|
h**********c 发帖数: 4120 | 49 好像这样吧
some.h
class c {
static std::vector sv;
public:
}
some.cpp
std::vector c::sv ;
最少visual c++ 是这样,
如何解释呢,header 里的东西不会成为memory instance,只有cpp 里才可以。 |
h********n 发帖数: 1671 | 50 别人需要看的是声明,而不是定义。到.cpp里看定义才知道它是什么,这样更confuse
别人。
进入main()以后进行实质的初始化,可以保证这时所有变量都已经处在valid状态。你
这个例子用的都是库类型,还问题不大。如果某一天你换成了自己的string类,或者改
用自己的allocator,那这种静态初始化的用法就是一个定时炸弹,不知什么地方就有
可能会引用到一个还没有初始化的变量。
原则上static变量的初始状态都应该尽可能简单。把复杂的参数写进构造函数参数列表
,与用一个函数来初始化没有区别,因为构造函数也是一个函数,只是语法不同。
前面的几个答案里,初始化为empty的那个才是最好的design,有经验的人都会这样写
。其他几个答案不过是为了满足你这个奇怪的用法而凑出来的。
另一方面,如果你不打算进行动态修改的话,为什么要用vector?这时用char
*[]是最合理的。如果你打算在程序中进行动态修改的话,动态初始化自然也很正常。
【在 m*********g 的大作中提到】 : 觉得动态的进行初始化这个做法会 confuse 别人,别人在用这个class的时候会不知道 : 它是什么,也许不是一个很好的design。 : : member
|
|
|
l*********s 发帖数: 5409 | 51 Agree, bad practices are bad no matter how fancy codes look. Combo of C++ and full-of-oneself attitude is a perfect recipe for disasters.
confuse
【在 h********n 的大作中提到】 : 别人需要看的是声明,而不是定义。到.cpp里看定义才知道它是什么,这样更confuse : 别人。 : 进入main()以后进行实质的初始化,可以保证这时所有变量都已经处在valid状态。你 : 这个例子用的都是库类型,还问题不大。如果某一天你换成了自己的string类,或者改 : 用自己的allocator,那这种静态初始化的用法就是一个定时炸弹,不知什么地方就有 : 可能会引用到一个还没有初始化的变量。 : 原则上static变量的初始状态都应该尽可能简单。把复杂的参数写进构造函数参数列表 : ,与用一个函数来初始化没有区别,因为构造函数也是一个函数,只是语法不同。 : 前面的几个答案里,初始化为empty的那个才是最好的design,有经验的人都会这样写 : 。其他几个答案不过是为了满足你这个奇怪的用法而凑出来的。
|
l********e 发帖数: 34 | 52 是的,是这样的。
我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一
个copy.
如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
【在 h**********c 的大作中提到】 : 好像这样吧 : some.h : class c { : static std::vector sv; : public: : } : some.cpp : std::vector c::sv ; : 最少visual c++ 是这样, : 如何解释呢,header 里的东西不会成为memory instance,只有cpp 里才可以。
|
x****u 发帖数: 44466 | 53 对于C++来说,只有一种源文件。
所以你应该了解一下什么东西可以写多次,什么只能写一次。
【在 l********e 的大作中提到】 : 是的,是这样的。 : 我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一 : 个copy. : 如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
|
l********e 发帖数: 34 | 54 Could you elaborate a little bit for this problem?
【在 x****u 的大作中提到】 : 对于C++来说,只有一种源文件。 : 所以你应该了解一下什么东西可以写多次,什么只能写一次。
|
x****u 发帖数: 44466 | 55 实体只能define一次,但是可以declare多次。
【在 l********e 的大作中提到】 : Could you elaborate a little bit for this problem?
|
t****t 发帖数: 6806 | 56 c++ 标准显然没有禁止过这回事. 一般的说, 建议不要在头文件里定义对象, 这是对的.
【在 l********e 的大作中提到】 : 是的,是这样的。 : 我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一 : 个copy. : 如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
|
h********n 发帖数: 1671 | 57 补充一点,static的或是unnamed namespace中的全局变量可以定义在头文件中,当然
不建议这样做。整数类型的static const没问题。template的static变量和inline函数
当中的static变量,就只能定义在头文件中了。
其它情况,不是被多次初始化的风险,而是无法链接。
【在 l********e 的大作中提到】 : 是的,是这样的。 : 我的理解是:C++标准禁止在头文件中定义静态变量,是因为静态变量在程序里只有一 : 个copy. : 如果在头文件中定义就有被多次初始化的风险(因为头文件能够被include多次)。
|
l********e 发帖数: 34 | 58 受教了。
【在 h********n 的大作中提到】 : 补充一点,static的或是unnamed namespace中的全局变量可以定义在头文件中,当然 : 不建议这样做。整数类型的static const没问题。template的static变量和inline函数 : 当中的static变量,就只能定义在头文件中了。 : 其它情况,不是被多次初始化的风险,而是无法链接。
|
r****t 发帖数: 10904 | 59 这个地方 vector A::v = A::f();
这一句没有像你说的一样写在 main() 里面,是笔误,还是就应该在外面?
member
struct A
{
static vector v;
static vector f(){ vector v; v.push_back("123"); v.push_back
("abc"); return v;}
};
vector A::v = A::f();
int main()
{
cout << A::v[0] << " " << A::v[1] << endl;
}.
【在 h********n 的大作中提到】 : 向别人问问题起码要虚心一点,自己问的不清楚也不能责怪别人,别人来回答已经是很 : 热心了。 : static变量可以用一个函数的返回值来初始化,可以任意复杂,也不限于class member : 。但是复杂数据结构的static变量最好不要进行复杂的初始化。如果只是book : knowledge,最好是直接用char* array,不要用vector。如果必需要用有复杂 : 数据结构的static变量,最好是先缺省初始化为empty,然后在main()里动态的进行初 : 始化。 : using namespace std; : struct A : {
|
z****e 发帖数: 2024 | 60 "unnamed namespace中的全局变量"???
unnamed namespace 本来就是只有internal linkage,何谈全局?
"整数类型的static const没问题"???
用不着static,和整数,const默认就是internal linkage的。
“inline函数当中的static变量,就只能定义在头文件中了”???
定义在cpp中完全没有问题。
【在 h********n 的大作中提到】 : 补充一点,static的或是unnamed namespace中的全局变量可以定义在头文件中,当然 : 不建议这样做。整数类型的static const没问题。template的static变量和inline函数 : 当中的static变量,就只能定义在头文件中了。 : 其它情况,不是被多次初始化的风险,而是无法链接。
|