| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1213 人关注过本帖
标题:又是静态成员初始化问题。。帮我看看这个问题出在哪里?用静态成员函数初始 ...
只看楼主 加入收藏
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
结帖率:88.89%
收藏
已结贴  问题点数:100 回复次数:8 
又是静态成员初始化问题。。帮我看看这个问题出在哪里?用静态成员函数初始化静态数据成员
怎么用静态成员函数初始化静态数据成员?


例如:
程序代码:
class A{
public:
//……
static void ps(vector<string>& vec_str);
//……
private:
static const vector<string>* _ps;

//……


}
A::ps( vector<string>& vec_str )
{
    //我是这么想的:
    vector<string>* A::_ps=new vector<string>(vec_str);  
    //这里出错了。说是声明冲突。请问怎么才能正确初始化?
    //换成下面这样对吗?
    //vector<string>* _ps=new vector<string>(vec_str);    

    ……
}



不知道有没笔误。程序很长,只好临时照着情况比喻一下。不知道有没有笔误,也不知道说清楚问题没有。在线等。请大哥大姐们帮下。谢谢。送上100分,不成敬意,只是表明很急的意思……

[ 本帖最后由 laigaoat2005 于 2011-5-21 17:19 编辑 ]
搜索更多相关主题的帖子: 数据 问题 
2011-05-21 17:13
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
换成下面那一行还是不对。因为程序后面又说_ps 未定义 (undefined reference to `A::_ps)
2011-05-21 17:22
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
TextQuery.rar (11.56 KB)

算了。我还是把程序送上来吧。有时间的大哥们帮忙编译下看看问题。
2011-05-21 18:03
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:80 
程序代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class A
{   
public:
    static void ps(vector<string> & vec_str);
    static void ps(vector<string>::iterator, vector<string>::iterator);
private:
    static  vector<string>* pss;
};

vector<string> * A::pss = new vector<string>();

void A::ps(vector<string> &vec_str)
{
    pss = new vector<string>(vec_str);
    cout << (*pss)[0] << ' ' << (*pss)[1] << ' ' << (*pss).size() << endl;
}

void A::ps(vector<string>::iterator begin, vector<string>::iterator end)
{
    pss = new vector<string> (begin, end);
    cout << (*pss)[0] << ' ' << (*pss)[1] << ' ' << (*pss).size() << endl;
}

int main(void)
{
    A a;
    vector<string> vec_str;
    vec_str.push_back("yxf");
    vec_str.push_back("1111");

    //a.ps(vec_str);
    a.ps(vec_str.begin(), vec_str.end());

    return 0;
}
2011-05-21 18:14
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
你试试上面的  两个函数都可以  
2011-05-21 18:14
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
谢谢。我试了,你的例子是正确的。
但我还是不知道我为什么是错的。我感觉我的代码和你的是一样的。但我的代码始终有错:
程序代码:
class TextQuery {
public:
    //将this所指向的某一块内存中的每个字节的内容全部设置为ASCII值0, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。
    TextQuery() {    memset( this, 0, sizeof( TextQuery ));     }
    ~TextQuery(){    delete _line_cnt;    }
    static void filter_elements( string felems ) { filt_elems = felems; }
    void query__text();
    void display_map_text();
    void display_text_locations();
    void display_solution();
    void build_text_map()//// 原来 的 doit()
    {
        retrieve_text();
        separate_words();
        filter_text();
        suffix_text();
        strip_caps();
        build_word_map();
        //all_locs();
    }
    static void line_cnt(text_loc*);   //为了设置AndQuery静态成员,所有单词的最大列数 的静态成员函数
private:
    void retrieve_text();
    void separate_words();
    void filter_text();
    void strip_caps();
    void suffix_text();
    void suffix_s( string& );
    void build_word_map();
private:
    vector<string> *lines_of_text;
    text_loc *text_locations;       //所有单词和所有单词的行列位置  typedef pair<text*,loc*> text_loc;
    map< string,loc*> *word_map;
    static const vector<int>* _line_cnt; //为了AndQuery准备的静态成员 所有单词的最大列数
    static string filt_elems;
    Query* query;   //为了 TextQuery.cpp中的一条语句  query->eval();   !!!!1而加了数据成员。构造函数中还没有涉及。
}; 







void TextQuery::line_cnt(text_loc*  words_and_locs) //为了设置AndQuery静态成员,所有单词的最大列数 的静态成员函数
{
    //typedef pair<text*,loc*> text_loc;
    //typedef vector<location> loc;
    loc*  p_locs=words_and_locs->second;//获取所有单词的行列位置
    loc::iterator iter=p_locs->begin(),iter_end=p_locs->end();
    vector<int> line_cnt_temp;
    while(iter != iter_end)
    {
        line_cnt_temp.push_back((*iter).second);
        iter++;
    }
    _line_cnt = new vector<int> (line_cnt_temp.begin(),line_cnt_temp.end());
}


--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

检查文件依赖性...
正在编译 D:\我的文档\TextQuery\main.cpp...
正在连接...


[Error] D:\我的文档\TextQuery\TextQuery.cpp:16: undefined reference to `TextQuery::_line_cnt'
[Error] D:\我的文档\TextQuery\TextQuery.cpp:205: undefined reference to `NotQuery::all_locs
构建中止 main: 6 个错误, 0 个警告


我只写出了前两个错误
2011-05-21 19:42
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
换一个简单的。
程序代码:
// 标准库头文件
#include <vector>
#include <iterator>
#include <iostream>
    using namespace std;
class TextQuery {
public:
    static void line_cnt();   //为了设置AndQuery静态成员,所有单词的最大列数 的静态成员函数
private:
    static const vector<int>* _line_cnt;
};
void TextQuery::line_cnt() 
{

    vector<int> vec_int;
    for(int i=155;i<160;i++)
        vec_int.push_back(i);
    _line_cnt = new vector<int> (vec_int);
}

int main()
{
    TextQuery a;
    a.line_cnt();
    return 0;
}
相同的错误。看了七小时代码了,头都晕了。
2011-05-21 19:59
gmac
Rank: 2
等 级:论坛游民
帖 子:174
专家分:85
注 册:2010-9-28
收藏
得分:20 
你的第一种方法是重复定义了。在static函数中可以直接访问所属类的static成员
你的第二种方法是没有对类中的static成员进行初始化,你的做法只是定义了一个局部变量并进行了初始化。
2011-05-21 20:38
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
休息了一会,清醒后来看,发现问题不向想象的那么严重。已经解决。
问题是:
在用静态成员函数时设置静态成员数据时,还是必须要先在类体外定义静态数据成员。。谢谢两位。
昨天弄了13小时,终于算基本弄出来了。目前还没有发现bug.再一次谢谢两位,特别感谢 诸葛修勤 。我是清醒后反复对比两个程序才找到原因,原因是对教材上的 “静态数据成员要在类体外定义”这句话理解不深。
这贴,结了吧。可能还有在帮我思考的朋友们,这里也感谢你们了。
2011-05-22 10:18
快速回复:又是静态成员初始化问题。。帮我看看这个问题出在哪里?用静态成员函数 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029698 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved