C++常见问题总结

C++问题总结模块

编程之路总是路漫漫其修远兮,吾将上下而求索。

1.no matching function for call to

借用CSDN某位的文章,成功修改错误
大概截图如下
源代码:
C++常见问题总结_第1张图片
C++常见问题总结_第2张图片

2.return type specification for constructor invalid

构造函数的返回类型规范无效
C++常见问题总结_第3张图片
该函数为构造函数,无需在前面多加void

3.最好自己定义π

C中 #define PI 3.1415926
C++ const float/double PI=3.1415926

4.以为是个大问题

.cpp:(.rdata$.refptr._ZTV5Shape[.refptr._ZTV5Shape]+0x0): undefined
reference to `vtable for Shape’

意思为:Shape报错,定义有问题;
发现多写了抽象类函数的一个变量,导致出错;另外,对虚函数没有进行

virtual double MySpace()

更改为

virtual double Myapce()=0;

5.文件流指针的操作

1.读取文件到另一个文件中,最后一次读取的数据会在写入的文件中出现两次,
解决办法:注意读取文件的最后一行不加换行符

#include
#include
#include 
#include

using namespace std;

void WriteCommodity(const char* filenamea,const char* filenameb,string t) //将文件b中的内容传递给文件a 
{
    ifstream fpb(filenameb/*,ios::in*/); //读取文件b的内容,in 为输入(读)而打开文件 
    ofstream fpa(filenamea/*,ios::out*/);  //将内容写入文件a, out 为输出(写)而打开文件 
   
     
    if(!fpb.good()&&!fpa.good())
 	{
 		cout<<"打开失败"<<endl;
	    return ;
	 }
    else if(!fpb.good())
    {
    	cout<<"打开失败"<<endl;
    	fpa.close(); //关闭文件a 
        return ;
	}
	else if(!fpa.good())
	{
		cout<<"打开失败"<<endl;
		fpb.close();  //关闭文件b 
		return ;
	}
    
    string na,ty;
	double pr;
	int nu;
	double di;
	string ds;
    
    while(!fpb.eof())
    {
    	fpb>>na>>ty>>pr>>nu>>di>>ds;
    	if(na==t)
    	  fpa<<na<<endl<<ty<<endl<<20.0<<endl<<nu<<endl<<di<<endl<<ds<<endl;
    	else
          fpa<<na<<endl<<ty<<endl<<pr<<endl<<nu<<endl<<di<<endl<<ds<<endl;
    }
    
    fpa.close();
    fpb.close();
	
	return ;
}

void WriteUser(const char* filenamea,const char* filenameb,string t) //将文件b中的内容传递给文件a 
{
    ifstream fpb(filenameb,ios::in);
    ofstream fpa(filenamea,ios::out);
    
    string ac,name,pwd;
    double bl;
    int ty;
    
    //注意,为了避免最后一次数据被读取两次,最后一行数据不要加换行符 
    
   while(!fpb.eof())   //使用eof判断会出现问题,文本的最后一次读取,读取了两次 
   // while(fpb.peek()!=EOF) //文本的最后一次读取,还是两遍 
    {
    	fpb>>ac>>name>>pwd>>bl>>ty;
    	if(ac==t) 
            fpa<<ac<<endl<<name<<endl<<pwd<<endl<<20.0<<endl<<ty<<endl;
        else
           fpa<<ac<<endl<<name<<endl<<pwd<<endl<<bl<<endl<<ty<<endl;
    }
    fpa<<"202004"<<endl<<"111"<<endl<<"222"<<endl<<20.0<<endl<<1<<endl; 
    fpa.close();
    fpb.close();
	return ;
}

int main()
{
	WriteUser("temp.txt","user.txt","202002");  //将 temp.txt 文件内容读入 user.txt 
//	WriteCommodity("commodity.txt","temp.txt");
	
	return 0;
}

2.读取文件模式总结
ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件
ios::binary 二进制方式

不加app模式会直接覆盖原文件数据输出

3.状态标识符
bad()
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。

fail()
除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。

eof()
如果读文件到达文件末尾,返回true。

good()
判断一个文件是否成功打开

注意:打开文件之后必须关闭文件;若文件未成功打开,由于没有返回句柄,无需关闭文件;

6.不明确符号报错问题

  1. “cin” “cout” "system"等类似不明确符号报错,是由于未指明命名空间所导致的。 解决方法如下: 删除using
    namespace std; 语句后保存.cpp文件 再加上using namespace std; 语句保存.cpp文件
  2. 还有一类不明确符号报错问题,是由于项目中所使用的变量名,在命名空间中已有该变量名 解决方法有两个:
    一、把这个变量名换掉,使之不与命名空间中变量名冲突 二、指明命名空间,使编译器知道项目所使用的的命名空间

转载:本文链接:https://blog.csdn.net/weixin_44841414/article/details/106492264

7.vector容器

1.swap函数
swap操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配: 必须是相同类型的容器,而且所存储的元素类型也必须相同。调用了swap函数后,右操作数原来存储的元素被存放在左操作数中,反之亦然。
vector svec1(10); //vector vith 10 elements
vector svec2(24); //vector with 24 elements
svec1.swap(svec2);
执行swap后,容器svec1中存储24个string类型的元素,而svec2则存储10个元素。
关于swap的一个重要问题在于:该操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。

用法
void swap( basic_string &str );
swap()函数把str和本字符串交换。例如:
string first( “This comes first” );
string second( “And this is second” );
first.swap( second );
cout << first << endl;
cout << second << endl;

————————————————

原文链接:https://blog.csdn.net/weixin_45621943/article/details/10780410

vector清空元素的三种方法

#include 
#include 

using namespace std;

//STL vector的几种清空容器(删除)办法

void test()
{
    vector<int> vecnum;
    vecnum.push_back(1);
    vecnum.push_back(2);
    vecnum.push_back(3);
    vecnum.push_back(4);
    vecnum.push_back(5);
    vecnum.push_back(6);
    vecnum.push_back(7);

    //打印vector的大小和容量
    cout << "old: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;

    //1. clear(),清空元素,但不回收空间

    //vecnum.clear();

    //2. 使用 erase循环删除,结果同上

    //vector::iterator it;
    //for (it = vecnum.begin(); it != vecnum.end(); )
    //{
    //    //注意使用erase()方法时,迭代不要随意的++
    //    it = vecnum.erase(it);
    //}

    //结论:erase在每次操作时,迭代器指针会整体前移1,就是每次都会移动全部数据,所以vector不适合做频繁删除的容器

    //3. 最简单的使用swap,清除元素并回收内存
    //3.1 写法一

    //vector().swap(vecnum);

    //3.2 写法二
    vecnum.swap(vector<int>());

    //打印vector的大小和容量
    cout << "last: size = " << vecnum.size() << " ; capacity = " << vecnum.capacity() << endl;

}

int main()
{
    test();
    getchar();
    return 0;
}

转自:https://www.cnblogs.com/zhanggaofeng/p/9338681.html

8.文本文件出现乱码情况总结

  1. 修改文本文件编码(百度即可)

9.传引用和传类型

C++ 将某类对象传递给函数,在函数内修改类中的值,但是从函数中出来后,类对象的值没有发生改变C++常见问题总结_第4张图片C++常见问题总结_第5张图片

传递对对象的引用
C++常见问题总结_第6张图片

C++常见问题总结_第7张图片

你可能感兴趣的:(C++,常见运行错误,c++)