在Qt使用单件设计模式的问题

Falleyes 2014-09-10 11:11:27
首先展示主要代码:
//NameSource.h
#ifndef NAMESOURCE_H
#define NAMESOURCE_H

#include<vector>
#include<string>

/*单件的设计模式
**操作文件,来读取和写入相关数据,
存储在title和message两个vector<string>中*/

class NameSource{
private:
static NameSource name;
std::vector<std::string> title;
std::vector<std::string> message;
char* fileName;
public:
static NameSource& instance(){return name;} //返回单件引用
NameSource(){
fileName="Source.txt";
}
~NameSource(){}

void readFile();
void writeFile();
std::string& getTitle(int i){return title[i];}
std::string& getMessage(int i){return message[i];}
};

#endif // NAMESOURCE_H
//NameSource.cpp
#include<fstream>
#include<vector>
#include<string>
#include"NameSource.h"

NameSource NameSource::name; //实例化单件

void NameSource::readFile(){
std::ifstream is(fileName);
for(size_t i=0;i<10;++i){
std::string temp;
std::getline(is,temp);
std::string first=temp.substr(0,temp.find(' '));
std::string second=temp.substr(temp.find(' ')+1,temp.size()-1);
title.push_back(first);
message.push_back(second);
}
}

void NameSource::writeFile(){
std::ofstream os(fileName);
for(size_t i=0;i<10;++i){
os<<title[i]<<' '
<<message[i]<<'\n';
}
}

//mainwindow.h省略
//mainwindow.cpp
#include<string>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"message.h"
#include"NameSource.h"
#include"login.h"
#include"findpath.h"

//... 若干代码

void MainWindow::SetMessage(int index){ //经过调试index 没有问题
NameSource::instance().readFile(); //从文件中读取数据
//std::string testtitle=NameSource::instance().getTitle(index);
//std::string testmessage=NameSource::instance().getMessage(index);
//经过调试,当index在合理范围内,得到以上注释string的值均为空
ShowTitle=QString::fromStdString(NameSource::instance().getTitle(index));
ShowMessage=QString::fromStdString(NameSource::instance().getMessage(index));

message=new Message(this,ShowTitle,ShowMessage);
message->show();
}

当我将代码文件NameSource.h和NameSource.cpp提出,加上main.cpp构成工程时,类似代码是可以得到非空字符串,而并不是以上mainwindow.cpp文件得到的空字符串。
以下是main.cpp代码以及运行截图:

#include<iostream>
#include<vector>
#include"NameSource.h"
using namespace std;

int main(){
NameSource::instance().readFile(); //读取文件得到数据
for(int i=0;i<10;++i){
cout<<NameSource::instance().getTitle(i)<<' ';
cout<<NameSource::instance().getMessage(i)<<endl;
}
}



我是Qt新手,请问是否是某些东西我没有加上?还是其他地方有问题?
课程设计上纠结了很久的问题,希望能够得到帮助!
...全文
165 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜗牛sf 2014-09-11
  • 打赏
  • 举报
回复
单例模式构造函数还是public,这就没什么意义了吧?看了其他的代码,功能来说,没有发现字符串为空,还是调试一下吧
Falleyes 2014-09-11
  • 打赏
  • 举报
回复
引用 3 楼 dbzhang800 的回复:
1. 你的单件的类问题太多了,你需要好好完善。不过你疑惑的问题应该和单件无关。 2. 注意,你代码中使用了相对路径! 如果你对“工作目录”的概念不熟悉,那么你就需要好好补课了。
1. 嗯,我已经在完善了。 2. 我确实对这个概念不熟悉,好好补补! 我把路径修改为绝对路径就成功了,非常感谢你! 相关的知识我会继续加深学习的,100分献上! 再次表示感谢!
dbzhang800 2014-09-11
  • 打赏
  • 举报
回复
1. 你的单件的类问题太多了,你需要好好完善。不过你疑惑的问题应该和单件无关。 2. 注意,你代码中使用了相对路径! 如果你对“工作目录”的概念不熟悉,那么你就需要好好补课了。
Falleyes 2014-09-11
  • 打赏
  • 举报
回复
引用 1 楼 soso101 的回复:
单例模式构造函数还是public,这就没什么意义了吧?看了其他的代码,功能来说,没有发现字符串为空,还是调试一下吧
请问这种静态变量调试的时候在哪个地方查看?我在局部变量区找不到啊!或者怎样跟踪变量,把这个变量添加监视? 如果能够监视这个static变量,肯定可以发现问题的。

16,213

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧