user-0 提问: 小白求帮忙

回复:
user: user-1
content: 我都说了C不能实现你的目标。  最后我给你一个完整版的C++类：   #pragma once  #include <limits> #include <sstream>  class Double { public:  	Double(void) 	{ 		initialize(-std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), std::numeric_limits<double>::max()); 	}  	Double(Double& other) 	{ 		*this = other; 	}  	Double(double minimum, double maximum, double current) 	{ 		initialize(minimum, maximum, current); 	}  	Double(double minimum, double maximum) 	{ 		initialize(minimum, maximum, maximum); 	}  	Double(double current) 	{ 		initialize(-std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), current); 	}  	virtual ~Double(void) 	{  	}  private:  	void initialize(double minimum, double maximum, double current) 	{ 		setMinimum(minimum); 		setMaximum(maximum); 		setCurrent(current); 	}  	void doCheckCurrent(double current) 	{ 		if(current > this->getMaximum() || this->getMinimum() > current) 			throw std::exception("value out."); 	}  public: 	Double& operator=(const Double& other) 	{ 		setMinimum(other.getMinimum()); 		setMaximum(other.getMaximum()); 		setCurrent(other.getCurrent());  		return (*this); 	}  	Double& operator=(const double current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const float current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const int current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const char* current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const wchar_t* current) 	{ 		setCurrent(current); 		return (*this); 	}  	operator double() const 	{ 		return (this->_current); 	}  	friend std::istream& operator>>(std::istream& stream, Double& me) 	{ 		double _current_ = 0.0; 		stream >> _current_; 		me.setCurrent(_current_); 		return (stream); 	}  	friend std::ostream& operator<<(std::ostream& stream, Double& me) 	{ 		stream << me.getCurrent(); 		return (stream); 	}  public: 	double getCurrent() const 	{ 		return (_current); 	}  	void setCurrent(double current) 	{ 		doCheckCurrent(current); 		this->_current = current; 	}  	void setCurrent(const char* current) 	{ 		double _current_ = 0.0; 		std::stringstream stream(current); 		stream >> _current_; 		setCurrent(_current_); 	}  	void setCurrent(const wchar_t* current) 	{ 		double _current_ = 0.0; 		std::wstringstream stream(current); 		stream >> _current_; 		setCurrent(_current_); 	}  	double getMaximum() const 	{ 		return (_maximum); 	}  	void setMaximum(double maximum) 	{ 		this->_maximum = maximum; 	}  	double getMinimum() const 	{ 		return (_minimum); 	}  	void setMinimum(double minimum) 	{ 		this->_minimum = minimum; 	}  private: 	double _current; 	double _maximum; 	double _minimum; };

user: user-0
content: 引用 9 楼 super_admi 的回复:我给个例子：  #pragma once class Double { public:  	Double(void){ value = 0.0; } 	Double(double value) { *this = value; } 	Double(Double& other){ *this = other; } 	virtual ~Double(void){}  public: 	Double& operator=(const Double& other) 	{ 		checkValue(other.value); 		this->value = other.value; 		return (*this); 	}  	Double& operator=(const double value) 	{ 		checkValue(value); 		this->value = value; 		return (*this); 	}  private: 	void checkValue(const double value) 	{ 		if(value < 0 || value > 10) 		{ 			throw "the value can not < 0 or > 10"; 		} 	}  private: 	double value; };    测试：  	Double d(5.5); 	Double d1; 	d1 = 2.0; 	d1 = 11.0;//这里赋值会抛出异常  大佬能不能上C？我不太会C++。万分感谢

user: user-0
content: 引用 11 楼 super_admi 的回复:我都说了C不能实现你的目标。  最后我给你一个完整版的C++类：   #pragma once  #include <limits> #include <sstream>  class Double { public:  	Double(void) 	{ 		initialize(-std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), std::numeric_limits<double>::max()); 	}  	Double(Double& other) 	{ 		*this = other; 	}  	Double(double minimum, double maximum, double current) 	{ 		initialize(minimum, maximum, current); 	}  	Double(double minimum, double maximum) 	{ 		initialize(minimum, maximum, maximum); 	}  	Double(double current) 	{ 		initialize(-std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), current); 	}  	virtual ~Double(void) 	{  	}  private:  	void initialize(double minimum, double maximum, double current) 	{ 		setMinimum(minimum); 		setMaximum(maximum); 		setCurrent(current); 	}  	void doCheckCurrent(double current) 	{ 		if(current > this->getMaximum() || this->getMinimum() > current) 			throw std::exception("value out."); 	}  public: 	Double& operator=(const Double& other) 	{ 		setMinimum(other.getMinimum()); 		setMaximum(other.getMaximum()); 		setCurrent(other.getCurrent());  		return (*this); 	}  	Double& operator=(const double current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const float current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const int current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const char* current) 	{ 		setCurrent(current); 		return (*this); 	}  	Double& operator=(const wchar_t* current) 	{ 		setCurrent(current); 		return (*this); 	}  	operator double() const 	{ 		return (this->_current); 	}  	friend std::istream& operator>>(std::istream& stream, Double& me) 	{ 		double _current_ = 0.0; 		stream >> _current_; 		me.setCurrent(_current_); 		return (stream); 	}  	friend std::ostream& operator<<(std::ostream& stream, Double& me) 	{ 		stream << me.getCurrent(); 		return (stream); 	}  public: 	double getCurrent() const 	{ 		return (_current); 	}  	void setCurrent(double current) 	{ 		doCheckCurrent(current); 		this->_current = current; 	}  	void setCurrent(const char* current) 	{ 		double _current_ = 0.0; 		std::stringstream stream(current); 		stream >> _current_; 		setCurrent(_current_); 	}  	void setCurrent(const wchar_t* current) 	{ 		double _current_ = 0.0; 		std::wstringstream stream(current); 		stream >> _current_; 		setCurrent(_current_); 	}  	double getMaximum() const 	{ 		return (_maximum); 	}  	void setMaximum(double maximum) 	{ 		this->_maximum = maximum; 	}  	double getMinimum() const 	{ 		return (_minimum); 	}  	void setMinimum(double minimum) 	{ 		this->_minimum = minimum; 	}  private: 	double _current; 	double _maximum; 	double _minimum; };   谢大佬。但我还有一个问题。C的free释放后变量和指针是否还能继续使用？是否会重新生成不定值？

user: user-2
content: 你把这个范围等分以下给变量不就好了吗？等分数足够大，可认为接近连续的范围

user: user-3
content: SetXXX 里面判断？

user: user-1
content: C语言本身是做不到的。使用C++类方法的办法，勉强可以做到。

user: user-1
content: 我给个例子：  #pragma once class Double { public:  	Double(void){ value = 0.0; } 	Double(double value) { *this = value; } 	Double(Double& other){ *this = other; } 	virtual ~Double(void){}  public: 	Double& operator=(const Double& other) 	{ 		checkValue(other.value); 		this->value = other.value; 		return (*this); 	}  	Double& operator=(const double value) 	{ 		checkValue(value); 		this->value = value; 		return (*this); 	}  private: 	void checkValue(const double value) 	{ 		if(value < 0 || value > 10) 		{ 			throw "the value can not < 0 or > 10"; 		} 	}  private: 	double value; };    测试：  	Double d(5.5); 	Double d1; 	d1 = 2.0; 	d1 = 11.0;//这里赋值会抛出异常

user: user-1
content: 你首先要弄清楚，你的需求到底是什么，本质上需要解决什么问题。 在我看来，“限制取值范围”，其实是一个触发式操作，比如： 你定义了 int i; 平时你怎么用这个i都没有问题，但唯独在赋值的时候，必须有一个地方，能够检查所赋的值，是否符合要求，若符合要求则不管它，若不符合要求，则必须拦截，或者回滚，同时给出提示。 如果一定要用C语言来做这个事情，是很麻烦的，基本上，C语言本身是不太可能完成的（或许有高手能做到？），必须依赖操作系统或者硬件设施（因为你可以自己写操作系统）。 但是，在C#,JAVA，VB等语言中，都有一个事件的概念，就是当你做某个事情的时候，会触发一堆的预先设置好的操作。这就能满足你的要求了。 从这个思路触发，如果你在C或者C++中，加入一些人为的编程约定，那么也能做到这个事情了，比如： 给i复制的时候，必须调用setI()这个函数。 问题是，从编程思想上来说，C语言本身是不支持这种考虑方式的，所以我说C语言不能，但C++却支持这种思想方式。至于C#，则把这种思想固化在语言规范中：事件。  引用 4 楼 zyx6680599 的回复:[quote=引用 3 楼 weixin_43424867 的回复:] 你把这个范围等分以下给变量不就好了吗？等分数足够大，可认为接近连续的范围  引用 2 楼 jianwen0529 的回复:SetXXX 里面判断？  引用 1 楼 super_admi 的回复:C语言本身是做不到的。使用C++类方法的办法，勉强可以做到。 大佬们能不能开开恩，上具体代码？[/quote]

user: user-4
content: 表示看都看不懂

user: user-0
content: 引用 5 楼 u014417619 的回复:讲下你的详细需求吧，赋值时不是你赋的吗，你自己判断下不就可以了。  引用 5 楼 u014417619 的回复:讲下你的详细需求吧，赋值时不是你赋的吗，你自己判断下不就可以了。 大佬，我想要对math.h做补充，还有定义虚数，都要用到取值范围

user: user-5
content: 讲下你的详细需求吧，赋值时不是你赋的吗，你自己判断下不就可以了。

user: user-0
content: 引用 3 楼 weixin_43424867 的回复:你把这个范围等分以下给变量不就好了吗？等分数足够大，可认为接近连续的范围  引用 2 楼 jianwen0529 的回复:SetXXX 里面判断？  引用 1 楼 super_admi 的回复:C语言本身是做不到的。使用C++类方法的办法，勉强可以做到。 大佬们能不能开开恩，上具体代码？