C++ 函数的简单重载问题

C++ 函数的简单重载问题,c++,overloading,C++,Overloading,集合函数的思想: 第一个参数是引用,分配空间来保存测试的副本,将beany的str成员设置为指向新块,将测试复制到新块,并设置beany的ct成员 问题: 1)包含以下内容的行: for (int i = 0; i < temp.length(); i++) temp[i] = cstr[i]; 错误:表达式必须具有 指向对象类型的指针 3)stringy类型的函数show()重载无法找到匹配的函数签名,因为存在const 这些概念非常新,有人能解释一下错误的原因吗 #include

集合函数的思想:

第一个参数是引用,分配空间来保存测试的副本,将beany的str成员设置为指向新块,将测试复制到新块,并设置beany的ct成员

问题:

1)包含以下内容的行:

for (int i = 0; i < temp.length(); i++)
temp[i] = cstr[i];
错误:表达式必须具有 指向对象类型的指针

3)stringy类型的函数show()重载无法找到匹配的函数签名,因为存在const

这些概念非常新,有人能解释一下错误的原因吗

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <cstring>
#include <cctype>
struct stringy {
    char * str; //points to a string
    int ct; //length of string(not counting '\0')
};

void set(stringy & obj,  char cstr);
void show(const stringy & obj, int times=1);
void show(const char * cstr, int times = 1);

int _tmain(int argc, _TCHAR* argv[])
{
    string beany;
    char testing[] = "Reality isn't what it used to be.";

    set(beany, testing);
    show(beany);
    show(beany, 2);
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing);
    show(testing, 3);
    show("Done");
    return 0;
}

void set(stringy & obj, char cstr)
{
    char * temp = new char[cstr];
    obj.str = temp;
    for (int i = 0; i < temp.length(); i++)
    temp[i] = cstr[i];
}

void show(const stringy & obj, int times)
{
    for (int i = 0; i < times; i++)
        cout << obj.str;
}

void show(const char * cstr, int times)
{
    for (int i = 0; i < times; i++)
        cout << cstr;
}
#包括“stdafx.h”
#包括
使用名称空间std;
#包括
#包括
stringy结构{
char*str;//指向一个字符串
int ct;//字符串的长度(不计算“\0”)
};
无效集(stringy&obj、char cstr);
无效显示(常量stringy和obj,整数倍=1);
无效显示(常量字符*cstr,整数倍=1);
int _tmain(int argc,_TCHAR*argv[]
{
串珠;
char testing[]=“现实已经不是过去的样子了。”;
设置(beany,测试);
表演(比尼);
表演(比尼,2);
测试[0]=“D”;
测试[1]=“u”;
展示(测试);
显示(测试,3);
显示(“完成”);
返回0;
}
无效集(stringy&obj,char cstr)
{
char*temp=新字符[cstr];
obj.str=温度;
对于(int i=0;icout
temp
是一个常量字符*。该类型不提供任何类型的长度工具-它不是对象,也没有长度()成员方法。使用
std::string
-这就是它的用途。

temp
是常量字符*。该类型不提供任何类型的长度工具-它不是对象,也没有长度()成员方法。使用一个
std::string
-这就是它的用途。

我希望你不要把这当成是个人问题…但这段代码在这么多逻辑级别上有这么多错误,我认为这很简单

请帮自己一个忙,从阅读C++书籍开始。可以找到一个好的列表,也可以在网上免费找到合适的资源。

C++不是你(或任何其他人)希望通过键入一些字符并查看发生的事情而学习的语言……这只是对C++的自杀式的方法。 编辑:

for (int i = 0; i < temp.length(); i++)
temp[i] = cstr[i];
<> P> >在搜索引擎之后,你确实在跟踪一本书。从网上发现的一些摘录中,似乎有一本书是用C++来编程的。我认为这不是个好主意,因为C++太复杂,显然是不合逻辑的,不能成为程序员的第一语言,而且很容易得到编译F的程序。当你运行它们时,这会让你发疯。然而,有些大师认为这是一种可行的方法

你的书确实上市了,不是因为它很好,而是因为它的书名接近一本好书的书名。这可能只是一个销售它的营销伎俩

EDIT2:

for (int i = 0; i < temp.length(); i++)
temp[i] = cstr[i];
当你唯一的缺点是选择一本坏的书来学习C++时,我感到有点抱歉。尝试补偿这里是我试图告诉你我认为C++代码中存在的所有问题:

1、学习标准C++ 如果你正在学习C++,那么你应该尽量把微软告诉你的所有语言放在一边。标准C++对微软来说从来都不重要,可能是因为便携式代码对微软的威胁比对他们好。

一旦你知道C++(但只有那时),如果你是平台,编写微软特定代码就没问题了。但是重要的是你知道什么是MS和C++。但有时您实际上必须使用其语言变体来使用windows

MS开发工具非常棒(或者至少是……例如,我只是爱上了VC6)但他们总是试图欺骗您编写不可移植的代码。这在IDE和windows API示例中都可以做到。不要落入这些陷阱:编写可移植的代码,除非您确实需要特定于平台的代码,并且始终对此保持清醒

2.不要污染全局命名空间 这是一个坏主意。即使有点烦人,如果你习惯于在标准函数之前编写
std::
,也会好得多。原因是语言中存在复杂的名称查找和重载解析规则,以及在不知不觉中进入命名空间的所有名称关于他们

保存打字时间在C++中并不重要(在Perl中,如果你写一个丢弃脚本……而不是一般程序)是很重要的。更重要的是帮助谁是强>阅读<强>你的代码(并且包括你自己),并且使用<代码> STD::/COD>这样。

3.使用适当的主声明 这又是关于不要落入愚蠢的MS陷阱

int main(int argc, const char *argv[])
当你学习C++时,你不应该使用任何其他东西。如果你使用的MS工具不允许你写正确的声明(那就不足为奇了)。然后现在就把它扔到地板上,用一个工具来学习C++,它显示出对标准的一些尊重。一旦你知道C++,你就可以开始使用不可移植的东西,如果你真的需要但知道这是不可移植的东西。

是一个很好的Windows C++编译器,如果你喜欢的话,有很多年来我喜欢用一个好的编辑器(也可以,我用了很多年)还有一个命令行编译器,但主要是因为我在几个不同的操作系统上使用多种语言,没有一个IDE可以涵盖所有这些 void set(stringy & obj, char *cstr) { char * temp = new char[1 + strlen(cstr)]; obj.str = temp; strcpy(obj.str, cstr); } char *mystrcpy(char *dest, const char *src) { int i = 0; while (src[i] != '\0') { dest[i] = src[i]; i++; } dest[i] = '\0'; return dest; }

struct stringy
{
    int size;    // Number of characters EXCLUDING ending '\0'
    char *ptr;   // Pointer to first character

    stringy(const char *s = "")
        : size(strlen(s)), ptr(new char[1 + size])
    {
        strcpy(ptr, s);
    }

    ~stringy()
    {
        delete[] ptr;
    }

    stringy(const stringy& other)
        : size(other.size), ptr(new char[1 + size])
    {
        strcpy(ptr, other.ptr);
    }

    stringy& operator=(const stringy& other)
    {
        char *newptr = new char[1 + other.size];
        strcpy(newptr, other.ptr);
        delete[] ptr;
        ptr = newptr;
        size = other.size;
        return *this;
    }
};