C++ 函数的简单重载问题
集合函数的思想: 第一个参数是引用,分配空间来保存测试的副本,将beany的str成员设置为指向新块,将测试复制到新块,并设置beany的ct成员 问题: 1)包含以下内容的行: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
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;i couttemp
是一个常量字符*。该类型不提供任何类型的长度工具-它不是对象,也没有长度()成员方法。使用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;
}
};