问题描述
您好,堆栈成员溢出!我希望有一个一直在我身旁的人为我指明正确的方向。
我目前正在学习C ++并从事第12章中的图形练习,但是我似乎无法获得应该起作用的代码。 我已经尝试了几天,以使所有代码都能正常工作,并且已经克服了一些大问题,但是由于我只是在学习C ++,因此我目前处于我的专长极限之下,并且在各个论坛上穷尽了所有先前提出的问题,实际上,解决了我遇到的许多其他问题。
//
// This is example code from Chapter 12.3 "A first example" of
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//
#include <PPP2HEADERS/Simple_window.h>// get access to our window library
#include <PPP2HEADERS/Graph.h>// get access to our graphics library facilities
//------------------------------------------------------------------------------
int main()
{
using namespace Graph_lib; // our graphics facilities are in Graph_lib
Point tl(100,100); // to become top left corner of window
Simple_window win(tl,600,400,"Canvas"); // make a simple window
Graph_lib::polygon poly; // make a shape (a polygon)
poly.add(Point(300,200)); // add a point
poly.add(Point(350,100)); // add another point
poly.add(Point(400,200)); // add a third point
poly.set_color(Color::red); // adjust properties of poly
win.attach(poly); // connect poly to the window
win.wait_for_button(); // give control to the display engine
}
//------------------------------------------------------------------------------
尝试编译时收到错误消息:
1>------ Build started: Project: test2,Configuration: Debug Win32 ------
1>test4.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(45,10): warning C4305: 'initializing': truncation from 'Graph_lib::Color::Transparency' to 'char'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(45,46): warning C4309: 'initializing': truncation of constant value
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(47,10): warning C4305: 'initializing': truncation from 'Graph_lib::Color::Transparency' to 'char'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\Graph.h(47,39): warning C4309: 'initializing': truncation of constant value
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include\PPP2HEADERS\GUI.h(107,39): warning C4018: '<': signed/unsigned mismatch
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(16,23): error C2440: 'initializing': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(16,23): message : No constructor Could take the source type,or constructor overload resolution was ambiguous
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(22,28): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(22,28): message : No constructor Could take the source type,or constructor overload resolution was ambiguous
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(23,28): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(23,or constructor overload resolution was ambiguous
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(24,28): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Graph_lib::Point'
1>C:\Users\darai\Documents\PPP C++ CODE\chapter12_graphics_example\test2\test4.cpp(24,or constructor overload resolution was ambiguous
1>Done building project "test2.vcxproj" -- Failed.
========== Build: 0 succeeded,1 Failed,0 up-to-date,0 skipped ==========
我非常确定FLTK的安装正确,因为在本书的附录D中可以找到示例代码,该代码可以编译,并且我还使用here中提到的更新后的标头。
在这一点上,我一直在努力使图形代码能够正常工作几天,我想知道学习本书的图形部分是否绝对必要。
如果我违反了任何规则,任何人都可以提供的帮助将深表谢意,这是我第一次发帖要堆栈溢出。
谢谢。
Point.H根据要求:
//
// This is a GUI support code to the chapters 12-16 of the book
// "Programming -- Principles and Practice Using C++" by Bjarne Stroustrup
//
#ifndef POINT_GUARD
#define POINT_GUARD
namespace Graph_lib {
//------------------------------------------------------------------------------
struct Point {
int x,y;
};
//------------------------------------------------------------------------------
inline bool operator==(Point a,Point b) { return a.x==b.x && a.y==b.y; }
//------------------------------------------------------------------------------
inline bool operator!=(Point a,Point b) { return !(a==b); }
//------------------------------------------------------------------------------
}
#endif // POINT_GUARD
解决方法
假设以下目录布局,请根据需要进行调整。还要假设fltk\lib
中的FLTK库已经成功建立,例如Install-FLTK-for-use-with-Visual-C。
X:\ppp2code
├─fltk <-- FLTK root directory,based on fltk-1.3.5-source
│ ├─FL <-- include directory
│ └─lib <-- lib directory,with the prebuilt libraries
├─gui <-- PPP2 GUI (simple_window etc),based on stroustrup.com/programming_support.html
└─test4 <-- OP's test code
-
将{{1}中的
#include <PPP2HEADERS/Simple_window.h>
替换为#include <Simple_window.h>
,test4.cpp
替换为#include <PPP2HEADERS/Graph.h>
。 -
在当前目录设置为
#include <Graph.h>
的情况下,打开VS 2019的 x86本机工具命令提示符(cmd /k vcvars32.bat
)。 -
使用
X:\ppp2code
进行编译,以避免/W3
触发的警告(大多是无害的)。/W4
-
与支持的PPP2对象和预构建的FLTK库链接。
X:\ppp2code\test4>cl.exe /c /nologo /W3 /D "WIN32" /MD /EHsc /O2 /I "..\gui" /I "..\fltk" test4.cpp ..\gui\*.cpp
-
运行生成的
X:\ppp2code\test4>link /nologo /LIBPATH:"..\fltk\lib" /SUBSYSTEM:WINDOWS /OUT:"test4.exe" test4.obj graph.obj gui.obj simple_window.obj window.obj fltk.lib fltkimages.lib fltkjpeg.lib user32.lib gdi32.lib shell32.lib advapi32.lib ole32.lib
。