inline函数

这是Screen.h文件
#pragma once
#include <iostream>
#include <string>
class Screen
{
public:
	typedef std::string::size_type pos;
	Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht * wd, c){}
	char get() const{ return contents[cursor]; }
	char get(pos ht, pos wd) const;
	Screen &move(pos r, pos c);
	Screen &set(char);
	Screen &set(pos, pos, char);
	Screen &display(std::ostream &os)
	{
		do_display(os);
		return *this;
	}
	const Screen &display(std::ostream &os) const
	{
		do_display(os);
		return *this;
	}
	~Screen();
private:
	pos cursor = 0;
	pos height = 0, width = 0;
	std::string contents;
	void do_display(std::ostream &os) const
	{
		os << contents;
	}
};

在Screen.cpp文件里实现move,set,get等方法时,添加了inline

#include "Screen.h"

Screen::~Screen(){}
inline Screen &Screen::move(pos r, pos c)
{
	pos row = r * width;
	cursor = row + c;
	return *this;
}

inline char Screen::get(pos r, pos c) const
{
	pos row = r * width;
	return contents[row + c];
}

inline Screen &Screen::set(char c)
{
	contents[cursor] = c;
	return *this;
}

inline Screen &Screen::set(pos r, pos col, char ch)
{
	contents[r * width + col] = ch;
	return *this;
}

在ConsoleApplication1.cpp里调用这几个方法时会报错:

1>ConsoleApplication1.obj : error LNK2001: 无法解析的外部符号 "public: class Screen & __thiscall Screen::set(char)" (?set@Screen@@QAEAAV1@D @Z)

1>ConsoleApplication1.obj : error LNK2001: 无法解析的外部符号 "public: class Screen & __thiscall Screen::move(unsigned int,unsigned int)" (?move@Screen@@QAEAAV1@II@Z)

1>d:\visual studio 2013\Projects\ConsoleApplication1\Release\ConsoleApplication1.exe : fatal error LNK1120: 2 个无法解析的外部命令

报错找不到方法实现

折腾两小时才发现问题,下面是摘自C++ primer

在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。

   inline int min(int first, int secend) {/****/};

      inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline
函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。
当然,对于同一程序
的不同文件,如果inline函数出现的话,其定义必须相同。对于由两个文件compute.C和draw.C构成的程序来说,程序员不能定义这样的min()函数,它在compute.C中指一件事情,
而在draw.C中指另外一件事情。如果两个定义不相同,程序将会有未定义的行为:

      为保证不会发生这样的事情,建议把inline函数的定义放到头文件中。在每个调用该inline函数的
文件中包含该头文件。这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且
不可能在程序的生命期中引起无意的不匹配的事情。



你可能感兴趣的:(inline函数)