2 qq 33555452 qq_33555452 于 2016.04.02 22:35 提问

为什么这个程序不能正确运行? 求大家帮帮忙
 #include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include"HasPtr.h"
//#include"TreeNode.h"
using namespace std;
//13.27  30 31编写自己版本的使用引用计数的HasPtr
int main(int argc, char *argv[])
{
    //HasPtr p;
    //p.Print();
    //HasPtr p1 = p;
    //p1.Print();
    //p.Print();
    //HasPtr p2(p);
    //p.Print();
    //p2.Print();
    //HasPtr p3("my life");// 交换成功
    //HasPtr p4("you life");
    ////cout<<p4.ps_str();
    //Swap(p3, p4);
    vector<HasPtr> vec_has;
    string str;
    while (cin >> str)
    {
        HasPtr temp1;
        temp1.ps_str()=str;
        cout<<temp1.ps_str();
        vec_has.push_back(temp1);
    }
    stable_sort(vec_has.begin(), vec_has.end());
    for (auto i : vec_has)
        cout << i.ps_str() << "  ";
    system("pause");
}
下面的是这个文件:
#ifndef HasPtr_H
#define HasPtr_H
#include<string>
#include<iostream>
#include<vector>
using namespace std;
class HasPtr
{
    friend void Swap(HasPtr &p, HasPtr &q);
    friend bool operator<(const HasPtr &c, const HasPtr &d)
    {
        return *c.ps < *d.ps;
    }
public:
    //构造函数
    HasPtr(const  string &s=string()):ps(new string(s)),i(0),use(new size_t(1)){}
    //拷贝构造函数
    HasPtr(const HasPtr &p) :ps(p.ps), i(p.i), use(p.use) { ++*use; }
    HasPtr &operator=(const HasPtr&)  ;
    string ps_str() { return (*ps); }
    ~HasPtr();
    void Print();   
private:
    string *ps;
    int i;
    size_t *use;//用来记录有多少个对象共享use
};
HasPtr & HasPtr::operator=(const HasPtr &rhs)
{
    ++*rhs.use;
    if (--*use == 0)
    {
        delete ps;
        delete use;
    }
    ps = rhs.ps;//将数据rhs拷贝到本对象
    i = rhs.i;
    use = rhs.use;
    return *this;
}
HasPtr::~HasPtr()
{
    if (--*use == 0)
    {
        delete ps;
        delete use;
    }
}
void HasPtr::Print()
{
    cout << *use << endl;
}
void Swap(HasPtr &p, HasPtr &q)
{
    cout << *p.ps << *q.ps << endl;
    HasPtr temp;
    temp.ps = new string(*(p.ps));
    temp.i = p.i;
    delete p.ps;
    p.ps = new string(*(q.ps));
    p.i = q.i;
    q = temp;
    cout << *p.ps << *q.ps << endl;
}
#endif

2个回答

u012155923
u012155923   2016.04.02 23:13

编译过了没?说清楚输出是哪里有问题了?

qq_33555452
qq_33555452 编译过了,就是输不出来数据
2 年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.04.03 09:57

不能输出是因为你的ps_str()函数有问题,返回一个string对象然后赋值给它,楼主觉得有什么用?
要传string的指针回去,然后才能正确修改temp1里对应的ps的值

 string ps_str() { return (*ps); } 应该改为 string *ps_str() { return (ps); } 
 //以下的main函数也要改以下
 while (cin >> str)
    {
        HasPtr temp1;
        temp1.ps_str()=str;  //改为*(temp1.ps_str())=str;
        cout<<temp1.ps_str();  //改为cout<<*(temp1.ps_str()) << endl;
        vec_has.push_back(temp1);
    }
qq423399099
qq423399099 回复小灸舞: 学了多少语言。。。。楼主要干嘛。。。
2 年多之前 回复
qq423399099
qq423399099 回复qq_33555452: 没错,返回的是一个临时生成的一个对象,应当返回ps地址才行
2 年多之前 回复
qq_33555452
qq_33555452 可以顺便问你一下你学了多少语言了 吗
2 年多之前 回复
qq_33555452
qq_33555452 这个返回的是副本。。。对吗
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
汇编语言:实验8分析一个奇怪的程序
实验介绍实验8 分析一个奇怪的程序分析下面的程序,在运行前思考:这个程序可以正确返回吗?运行后再思考:为什么是这种结果?实验代码;实验8 分析一个奇怪的程序 ;分析下面的程序,在运行前思考:这个程序可以正确返回吗? ;运行后再思考:为什么是这种结果? assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 s...
[uva 12412]A Typical Homework(师兄帮帮忙)
不得不说,这一题有点6,主要有精度控制和计算平均数时不能除以0这些细节要注意,然而我是跪在了排名函数上,代码略凌乱,希望大家不要介意,就让这题作为我博客的开始吧.
例题4-6 师兄帮帮忙 UVa12412
例题4-6 师兄帮帮忙 UVa12412 感悟。 1、阅读书中题目,从网站下载英文原题,重点在看输出数据与格式。 2、开始编码,先搭函数框架,具体功能实现,待主体框架打好后,再进行。 3、程序测试比较繁琐,有较多的输出输出,有些接近现实的应用程序了。 4、add功能还算顺利,数据采用结构体数组的方式存储。 5、query功能,发现要添加要在结构体中继续添加一些数据,还需在add功能
JAVA 第二次试验:Java语言基础练习
第二次试验:Java语言基础练习一、实验目的:      1. 了解 Java 的数据类型 2. 掌握各种变量的声明方式及其使用范围。3. 理解 Java 程序语法结构,掌握顺序结构、选择结构和循环结构语法的程序设计方法。二、实验环境:       Windows下java SE。三、实验内容:(一) 声明不同数据类型的变量        1.编写声明不同数据类型变量的程序文件 KY2_1.jav...
算法竞赛入门经典(第2版)例题4-6 师兄帮帮忙 (A Typical Homework UVa 12412)
这道例题书上要求自己补全daim有个bug卡了我
为什么很多C++程序不能运行?
     利用Microsoft Visual C++6.0编写的C++源文件都编译,连接都可以通过,但就是不能运行,并出现如下提示:                cannot execute program这是什么原因呢?下面这个例子也是这样,请大家多多指教。#includeLRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);in
VC 这个程序可能安装不正确,和***不兼容,既,和windows兼容性设置
Windows,点击关闭之后,弹出兼容性报错,这是windows兼容性设置
HDU 2034 人见人爱A-B 集合减法
人见人爱A-B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 50869    Accepted Submission(s): 14383 Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单
win7程序关闭后弹出 程序兼容性助手 这个程序可能安装不正确 如果此程序没有正确安装,处理方式
用WTL编写的程序,编译成release后,在win7上关闭后,弹出这个对话框 处理方法: 将这个xml文件命名成 xxx.exe.manifest,保存到指定目录下 右键工程->properties-->Configuration Properties-->Manifest Tool-->Input and Output-->additional Ma
opencv用c++在vs2010上使用出现的一些问题和解决方法(imread加载不出图片)
“opencvtest.exe”: 已加载“C:\Windows\SysWOW64\opencv_core2411d.dll”,Cannot find or open the PDB file“opencvtest.exe”: 已加载“C:\Windows\SysWOW64\opencv_highgui2411d.dll”,Cannot find or open the PDB file出现如上问...