100% found this document useful (4 votes)
28 views

C Programming for Game Developers, Module II 1st edition by e Institute Publishing, Inc. 1584504528‎ 978-1584504528pdf download

The document is a comprehensive guide on C++ programming for game developers, specifically focusing on advanced topics such as templates, error handling, number systems, and Windows programming. It includes detailed chapters with objectives, examples, and exercises to enhance understanding. Additionally, it provides links to various related textbooks and resources for further learning.

Uploaded by

zetgatharu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (4 votes)
28 views

C Programming for Game Developers, Module II 1st edition by e Institute Publishing, Inc. 1584504528‎ 978-1584504528pdf download

The document is a comprehensive guide on C++ programming for game developers, specifically focusing on advanced topics such as templates, error handling, number systems, and Windows programming. It includes detailed chapters with objectives, examples, and exercises to enhance understanding. Additionally, it provides links to various related textbooks and resources for further learning.

Uploaded by

zetgatharu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 84

C Programming for Game Developers, Module II 1st

edition by e Institute Publishing, Inc.


1584504528‎ 978-1584504528 download

https://ebookball.com/product/c-programming-for-game-developers-
module-ii-1st-edition-by-e-institute-publishing-
inc-1584504528aeurz-978-1584504528-25190/

Instantly Access and Download Textbook at https://ebookball.com


Get Your Digital Files Instantly: PDF, ePub, MOBI and More
Quick Digital Downloads: PDF, ePub, MOBI and Other Formats

Introduction to 80 86 Assembly Language and Computer Architecture 1st


Edition by Richard C Detmer ISBN 0763746622 9780763746629

https://ebookball.com/product/introduction-to-80-86-assembly-
language-and-computer-architecture-1st-edition-by-richard-c-
detmer-isbn-0763746622-9780763746629-9016/

Introduction To 80 86 Assembly Language And Computer Architecture 1st


Edition by Detmer ISBN 0763717738 9780763717735

https://ebookball.com/product/introduction-to-80-86-assembly-
language-and-computer-architecture-1st-edition-by-detmer-
isbn-0763717738-9780763717735-12404/

Charles River Media 1st Edition by Game Programming Gems II ISBN

https://ebookball.com/product/charles-river-media-1st-edition-by-
game-programming-gems-ii-isbn-10118/

Mathematics for Game Developers 1st edition by Christopher Tremblay


159200038X 9781592000388

https://ebookball.com/product/mathematics-for-game-
developers-1st-edition-by-christopher-
tremblay-159200038x-9781592000388-23640/
Machine Learning for Cybersecurity Cookbook Over 80 recipes on how to
implement machine learning algorithms for building security systems
using Python 1st edition by Emmanuel Tsukerman 9781838556341
1838556346
https://ebookball.com/product/machine-learning-for-cybersecurity-
cookbook-over-80-recipes-on-how-to-implement-machine-learning-
algorithms-for-building-security-systems-using-python-1st-
edition-by-emmanuel-tsukerman-9781838556341-1/

C# Game Programming Cookbook for Unity 3D 2nd edition by Jeff Murray


9781000359725 1000359727

https://ebookball.com/product/c-game-programming-cookbook-for-
unity-3d-2nd-edition-by-jeff-
murray-9781000359725-1000359727-18762/

Beginning C++ Game Programming 1st Edition by Michael Dawson ISBN


1592002056 9781592002054

https://ebookball.com/product/beginning-c-game-programming-1st-
edition-by-michael-dawson-isbn-1592002056-9781592002054-12450/

Professional JavaScript for Web Developers 1st Edition by Nicholas C


Zakas ISBN 1118026691 9781118026694

https://ebookball.com/product/professional-javascript-for-web-
developers-1st-edition-by-nicholas-c-zakas-
isbn-1118026691-9781118026694-16162/

Beginning C++ Game Programming 1st edition Edition by Michael Dawson


ISBN 1592002056 9781592002054

https://ebookball.com/product/beginning-c-game-programming-1st-
edition-edition-by-michael-dawson-
isbn-1592002056-9781592002054-25056/
C++ Programming for
Game Developers
Module II

e-Institute Publishing, Inc.


©Copyright 2005 e-Institute, Inc. All rights reserved. No part of this book may be reproduced or
transmitted in any form or by any means, electronic or mechanical, including photocopying, recording,
or by any information storage or retrieval system without prior written permission from e-Institute Inc.,
except for the inclusion of brief quotations in a review.

Editor: Susan Nguyen


Cover Design: Adam Hoult

E-INSTITUTE PUBLISHING INC


www.gameinstitute.com

Frank Luna, C++ Programming for Games II

All brand names and product names mentioned in this book are trademarks or service marks of their
respective companies. Any omission or misuse of any kind of service marks or trademarks should not be
regarded as intent to infringe on the property of others. The publisher recognizes and respects all marks
used by companies, manufacturers, and developers as a means to distinguish their products.

E-INSTITUTE PUBLISHING titles are available for site license or bulk purchase by institutions, user
groups, corporations, etc. For additional information, please contact the Sales Department at
[email protected]
Table of Contents

MODULE II OVERVIEW........................................................................................................................................................1
CHAPTER 10: INTRODUCTION TO TEMPLATES ..........................................................................................................2
INTRODUCTION ........................................................................................................................................................................3
CHAPTER OBJECTIVES .............................................................................................................................................................3
10.1 CLASS TEMPLATES...........................................................................................................................................................4
10.1.1 Class Template Definition .......................................................................................................................................7
10.1.2 Class Template Implementation ..............................................................................................................................7
10.1.3 Class Template Instantiation...................................................................................................................................8
10.2 EXAMPLE: A TABLE TEMPLATE CLASS.............................................................................................................................9
10.2.1 Table Data...............................................................................................................................................................9
10.2.2 Class Interface.......................................................................................................................................................10
10.2.3 The destroy Method ..........................................................................................................................................11
10.2.4 The resize Method ............................................................................................................................................11
10.2.5 The Overloaded Parenthesis Operator .................................................................................................................13
10.2.6 The Table Class.....................................................................................................................................................13
10.3 FUNCTION TEMPLATES ..................................................................................................................................................17
10.3.1 Example Program .................................................................................................................................................18
10.4 SUMMARY ......................................................................................................................................................................21
10.5 EXERCISES .....................................................................................................................................................................21
10.5.1 Template Array Class............................................................................................................................................21
10.5.2 Template Bubble Sort Function.............................................................................................................................22
10.5.3 Table Driver ..........................................................................................................................................................22
CHAPTER 11: ERRORS AND EXCEPTION HANDLING...............................................................................................23
INTRODUCTION ......................................................................................................................................................................24
CHAPTER OBJECTIVES ...........................................................................................................................................................24
11.1 ERROR CODES ................................................................................................................................................................24
11.2 EXCEPTION HANDLING BASICS ......................................................................................................................................26
11.3 ASSERT ..........................................................................................................................................................................29
11.4 SUMMARY ......................................................................................................................................................................31
11.5 EXERCISES .....................................................................................................................................................................31
11.5.1 Exception Handling...............................................................................................................................................31
CHAPTER 12: NUMBER SYSTEMS ...................................................................................................................................33
INTRODUCTION ......................................................................................................................................................................34
CHAPTER OBJECTIVES ...........................................................................................................................................................34
12.1 NUMBER SYSTEMS .........................................................................................................................................................34
12.1.1 The Windows Calculator .......................................................................................................................................35
12.2 THE BINARY NUMBER SYSTEM ......................................................................................................................................37
12.2.1 Counting in Binary ................................................................................................................................................37
12.2.2 Binary and Powers of 2 .........................................................................................................................................38
12.2.3 Binary Arithmetic ..................................................................................................................................................39
Addition .......................................................................................................................................................................................... 39
Subtraction...................................................................................................................................................................................... 41
Multiplication ................................................................................................................................................................................. 43
12.2.4 Converting Binary to Decimal ..............................................................................................................................43
12.2.5 Converting Decimal to Binary ..............................................................................................................................44
12.3 THE HEXADECIMAL NUMBER SYSTEM...........................................................................................................................45
12.3.1 Counting in Hexadecimal......................................................................................................................................45
12.3.2 Hexadecimal Arithmetic ........................................................................................................................................46
Addition .......................................................................................................................................................................................... 46

i
Subtraction...................................................................................................................................................................................... 47
Multiplication ................................................................................................................................................................................. 48
12.3.3 Converting Hexadecimal to Binary .......................................................................................................................48
12.3.4 Converting Binary to Hexadecimal .......................................................................................................................49
12.4 BITS AND MEMORY ........................................................................................................................................................50
12.5 BIT OPERATIONS ............................................................................................................................................................51
12.5.1 AND.......................................................................................................................................................................51
12.5.2 Inclusive OR ..........................................................................................................................................................52
12.5.3 NOT.......................................................................................................................................................................52
12.5.4 Exclusive OR .........................................................................................................................................................53
12.5.5 Shifting ..................................................................................................................................................................53
12.5.6 Compound Bit Operators ......................................................................................................................................54
12.6 FLOATING-POINT NUMBERS ..........................................................................................................................................54
12.7 SUMMARY ......................................................................................................................................................................56
12.8 EXERCISES .....................................................................................................................................................................57
12.8.1 Binary Arithmetic ..................................................................................................................................................57
12.8.2 Hex Arithmetic.......................................................................................................................................................57
12.8.3 Base Conversions ..................................................................................................................................................58
12.8.4 Bit Operations .......................................................................................................................................................59
12.8.5 Binary to Decimal .................................................................................................................................................61
12.8.6 Decimal to Binary .................................................................................................................................................61
12.8.7 Bit Operation Calculator.......................................................................................................................................61
12.9 REFERENCES ..................................................................................................................................................................62
CHAPTER 13: STL PRIMER................................................................................................................................................63
INTRODUCTION ......................................................................................................................................................................64
CHAPTER OBJECTIVES ...........................................................................................................................................................64
13.1 PROBLEMS WITH ARRAYS ..............................................................................................................................................64
13.2 LINKED LISTS.................................................................................................................................................................66
13.2.1 Theory ...................................................................................................................................................................66
13.2.2 Traversing .............................................................................................................................................................71
13.2.3 Insertion ................................................................................................................................................................72
13.2.4 Deletion .................................................................................................................................................................73
13.3 STACKS ..........................................................................................................................................................................74
13.3.1 Theory ...................................................................................................................................................................74
13.3.2 Stack Operations ...................................................................................................................................................76
13.4 QUEUES .........................................................................................................................................................................78
13.4.1 Theory ...................................................................................................................................................................78
13.4.2 Queue Operations .................................................................................................................................................78
13.5 DEQUES .........................................................................................................................................................................80
13.5.1 Theory ...................................................................................................................................................................80
13.5.2 Deque Operations .................................................................................................................................................81
13.6 MAPS .............................................................................................................................................................................81
13.6.1 Theory ...................................................................................................................................................................81
13.6.2 Insertion ................................................................................................................................................................81
13.6.3 Deletion .................................................................................................................................................................82
13.6.4 Traversal ...............................................................................................................................................................82
13.6.5 Searching...............................................................................................................................................................83
13.7 SOME ALGORITHMS .......................................................................................................................................................84
13.7.1 Functors ................................................................................................................................................................84
13.7.2 Some More Algorithms..........................................................................................................................................88
13.7.3 Predicates..............................................................................................................................................................90
13.8 SUMMARY ......................................................................................................................................................................91
13.9 EXERCISES .....................................................................................................................................................................93
13.9.1 Linked List.............................................................................................................................................................93
13.9.2 Stack ......................................................................................................................................................................93

ii
13.9.3 Queue ....................................................................................................................................................................94
13.9.4 Algorithms .............................................................................................................................................................94
CHAPTER 14: INTRODUCTION TO WINDOWS PROGRAMMING ...........................................................................95
INTRODUCTION ......................................................................................................................................................................96
CHAPTER OBJECTIVES ...........................................................................................................................................................97
14.1 YOUR FIRST WINDOWS PROGRAM .................................................................................................................................97
14.2 THE EVENT DRIVEN PROGRAMMING MODEL ...............................................................................................................103
14.2.1 Theory .................................................................................................................................................................103
14.2.2 The MSG Structure...............................................................................................................................................103
14.3 OVERVIEW OF CREATING A WINDOWS APPLICATION ..................................................................................................104
14.3.1 Defining the Window Procedure .........................................................................................................................105
14.3.2 The WNDCLASS Structure...................................................................................................................................108
14.3.3 WNDCLASS Registration .....................................................................................................................................110
14.3.4 CreateWindow.....................................................................................................................................................110
14.3.5 Showing and Updating the Window ....................................................................................................................112
14.3.6 The Message Loop...............................................................................................................................................113
14.4 YOUR SECOND WINDOWS PROGRAM ...........................................................................................................................113
14.5 SUMMARY ....................................................................................................................................................................116
14.6 EXERCISES ...................................................................................................................................................................117
14.6.1 Exit Message .......................................................................................................................................................117
14.6.2 Horizontal and Vertical Scroll Bars....................................................................................................................117
14.6.3 Multiple Windows................................................................................................................................................117
14.6.4 Change the Cursor ..............................................................................................................................................117
14.6.5 Blue Background .................................................................................................................................................118
14.6.6 Custom Icon ........................................................................................................................................................119
CHAPTER 15: INTRODUCTION TO GDI AND MENUS...............................................................................................122
INTRODUCTION ....................................................................................................................................................................123
CHAPTER OBJECTIVES .........................................................................................................................................................123
15.1 TEXT OUTPUT ..............................................................................................................................................................124
15.1.1 The WM_PAINT Message....................................................................................................................................124
15.1.2 The Device Context .............................................................................................................................................124
15.1.3 TextOut ............................................................................................................................................................125
15.1.3 Example Program ...............................................................................................................................................126
15.2 SHAPE PRIMITIVES .......................................................................................................................................................131
15.2.1 Drawing Lines .....................................................................................................................................................131
15.2.2 Drawing Rectangles ............................................................................................................................................137
15.2.3 Drawing Ellipses .................................................................................................................................................141
15.3 LOADING AND DRAWING BITMAPS ..............................................................................................................................142
15.3.1 Loading ...............................................................................................................................................................142
15.3.2 Rendering ............................................................................................................................................................145
15.3.3 Deleting ...............................................................................................................................................................146
15.3.4 Sample Program..................................................................................................................................................146
15.4 PENS AND BRUSHES .....................................................................................................................................................150
15.4.1 Pens .....................................................................................................................................................................150
15.4.2 Brushes................................................................................................................................................................151
15.5 SHAPE CLASSES ...........................................................................................................................................................152
15.5.1 Class Definitions .................................................................................................................................................152
15.5.2 Class Implementations ........................................................................................................................................154
15.6 MENUS .........................................................................................................................................................................157
15.6.1 Creating a Menu Resource..................................................................................................................................157
15.6.2 Loading a Menu and Attaching it to a Window...................................................................................................160
15.6.3 Checking Menu Items ..........................................................................................................................................160
15.6.4 Selecting Menu Items ..........................................................................................................................................161

iii
15.7 THE PAINT SAMPLE......................................................................................................................................................161
15.8 SUMMARY ....................................................................................................................................................................171
15.9 EXERCISES ...................................................................................................................................................................172
15.9.1 Colors..................................................................................................................................................................172
15.9.2 Styles ...................................................................................................................................................................172
15.9.3 Cube ....................................................................................................................................................................172
15.9.4 Undo Feature ......................................................................................................................................................172
CHAPTER 16: INTRODUCTION TO DIALOGS AND CONTROLS............................................................................173
INTRODUCTION ....................................................................................................................................................................174
CHAPTER OBJECTIVES .........................................................................................................................................................174
16.1 MODAL DIALOG BOXES; THE STATIC TEXT CONTROL; THE BUTTON CONTROL .........................................................175
16.1.1 Designing the Dialog Box ...................................................................................................................................175
16.1.2 Modal Dialog Box Theory...................................................................................................................................179
16.1.3 The About Box Sample ........................................................................................................................................181
16.2 MODELESS DIALOG BOXES; THE EDIT CONTROL ........................................................................................................184
16.2.1 Modeless Dialog Box Theory ..............................................................................................................................184
16.2.2 The Edit Box Sample: Designing the Dialog Resource .......................................................................................186
16.2.3 The Edit Box Sample ...........................................................................................................................................187
16.3 RADIO BUTTONS ..........................................................................................................................................................191
16.3.1 Designing the Radio Dialog Resource ................................................................................................................191
16.3.2 Implementing the Radio Button Sample ..............................................................................................................192
16.4 COMBO BOXES .............................................................................................................................................................196
16.4.1 Designing the Combo Box Dialog Resource .......................................................................................................197
16.4.2 Implementing the Combo Box Sample.................................................................................................................197
16.5 SUMMARY ....................................................................................................................................................................201
16.6 EXERCISES ...................................................................................................................................................................202
16.6.1 List Box................................................................................................................................................................202
16.6.2 Checkbox Controls ..............................................................................................................................................202
16.6.3 File Save and Open Dialogs................................................................................................................................204
16.6.4 Color Dialog .......................................................................................................................................................206
CHAPTER 17: TIMING, ANIMATION, AND SPRITES.................................................................................................207
INTRODUCTION ....................................................................................................................................................................208
CHAPTER OBJECTIVES .........................................................................................................................................................208
17.1 TIMING AND FRAMES PER SECOND ..............................................................................................................................208
17.1.1 The Windows Multimedia Timer Functions.........................................................................................................208
17.1.2 Computing the Time Elapsed Per Frame ............................................................................................................211
17.1.3 Computing the Frames Per Second.....................................................................................................................213
17.2 DOUBLE BUFFERING ....................................................................................................................................................214
17.2.1 Motivation ...........................................................................................................................................................214
17.2.2 Theory .................................................................................................................................................................214
17.2.3 Implementation....................................................................................................................................................215
17.3 TANK ANIMATION SAMPLE ..........................................................................................................................................220
17.3.1 Creation...............................................................................................................................................................222
17.3.2 Destruction..........................................................................................................................................................222
17.3.3 Input ....................................................................................................................................................................223
17.3.4 Updating and Drawing........................................................................................................................................224
17.3.5 Point Rotation .....................................................................................................................................................228
17.3.6 Tank Application Code........................................................................................................................................229
17.4 SPRITES ........................................................................................................................................................................237
17.4.1 Theory .................................................................................................................................................................237
17.4.2 Implementation....................................................................................................................................................241
17.5 SHIP ANIMATION SAMPLE ............................................................................................................................................245
17.5.1 Art Resources ......................................................................................................................................................245
17.5.2 Program Code .....................................................................................................................................................246

iv
17.6 SUMMARY ....................................................................................................................................................................254
17.7 EXERCISES ...................................................................................................................................................................255
17.7.1 Colors..................................................................................................................................................................255
17.7.2 Draw Order.........................................................................................................................................................255
17.7.3 Masking ...............................................................................................................................................................255
17.7.4 Make Your Own Sprite ........................................................................................................................................256
17.7.5 Bouncing Ball......................................................................................................................................................256
17.7.6 Modify the Ship Program ....................................................................................................................................256
17.7.7 Pong ....................................................................................................................................................................256
17.7.8 More on Animation..............................................................................................................................................257
CHAPTER 18: THE AIR HOCKEY GAME......................................................................................................................259
INTRODUCTION ....................................................................................................................................................................260
CHAPTER OBJECTIVES .........................................................................................................................................................260
18.1 ANALYSIS ....................................................................................................................................................................261
18.1.1 Object Identification............................................................................................................................................262
18.1.2 Game Behavior and Corresponding Problems to Solve......................................................................................262
18.2 DESIGN ........................................................................................................................................................................264
18.2.1 Algorithms ...........................................................................................................................................................264
18.2.1.1 Mouse Velocity ............................................................................................................................................................... 264
18.2.1.2 Red Paddle Artificial Intelligence ................................................................................................................................... 265
18.2.1.3 Puck Paddle Collision ..................................................................................................................................................... 267
18.2.1.4 Puck Wall Collision ........................................................................................................................................................ 272
18.2.1.5 Paddle Wall Collision ..................................................................................................................................................... 273
18.2.1.6 Pausing/Unpausing.......................................................................................................................................................... 275
18.2.1.7 Detecting a Score ............................................................................................................................................................ 275
18.2.2 Software Design ..................................................................................................................................................276
18.3 IMPLEMENTATION ........................................................................................................................................................280
18.3.1 Circle ..............................................................................................................................................................280
18.3.2 Rect ...................................................................................................................................................................281
18.3.3 AirHockeyGame ..................................................................................................................................................282
18.3.4 Main Application Code .......................................................................................................................................288
18.4 COLLISION PHYSICS EXPLANATION (OPTIONAL) .........................................................................................................295
18.4.1 Linear Momentum ...............................................................................................................................................296
18.4.2 Newton’s Second Law of Motion.........................................................................................................................297
18.4.3 Impulse Defined...................................................................................................................................................297
18.4.4 Newton’s Third Law of Motion ...........................................................................................................................298
18.4.5 Kinetic Energy and Elastic Collisions.................................................................................................................300
18.4.6 Collision and Response .......................................................................................................................................304
18.5 CLOSING REMARKS ......................................................................................................................................................308

v
Module II Overview

Module II is the second course in the C++ Programming for Game Developers series. Recall that in
Module I we started off by studying fundamental programming concepts like variables, console input
and output, arrays, conditional statements, strings, loops, and file input and output. We then pursued
higher level programming methodologies such as classes, object oriented programming design, operator
overloading, inheritance, and polymorphism. By now you should feel competent with the fundamentals
and at least comfortable with the higher level subject matter.

Our aim in Module II is twofold. Our first objective is to finish our study of C++ by examining
templates, error handling, the standard template library, and bitwise operations. Templates can be
thought of as a class factory, which allows us to generate similar yet unique classes, based on a code
template; this allows us to avoid duplicating code that is only slightly different. Error handling is an
important topic because things rarely work out as planned, and we will need to be able to detect
hardware failures, illegal operations, invalid input, corrupted and missing files, and the like in our code.
The standard template library is a set of generic ready to use C++ code that simplifies many day-to-day
programming tasks. In the STL chapter you will learn about several useful STL data structures and
algorithms, and the ideas behind them. The chapter on bitwise operations provides a deeper
understanding of computer memory and how numbers are represented internally. You will also learn
how to work in several other numbering systems such as binary and hexadecimal, which are more
natural from a computer’s point of view.

The second key theme in Module II is Windows programming. Here we will learn how to make familiar
Windows applications with resizable windows, mouse input, graphics, menus, dialog boxes, and
controls. In addition, we will learn how to implement 2D flicker free animation with double buffering,
and how to render 2D sprite images (i.e., graphical representation of game objects such as the main
character, landscape, and enemies). Finally, we conclude Module II by walking the reader through the
design and analysis of a fully functional 2D Air Hockey game, complete with graphics, physics,
artificial intelligence, and input via the mouse. This final project culminates much of the course
material.

By the end of this course, you will be well prepared for a first course in 3D game programming, as well
as many other interesting computer related fields that require an understanding of computer
programming as a qualification.

1
Chapter 10

Introduction to Templates

2
Introduction

You should recall from our discussions in Chapter 4 that std::vector can be thought of as a
“resizable array” (Section 4.6). However, what is interesting about std::vector is that we can
specify the type of vector to create with the angle bracket syntax:

vector<int> intVec;

vector<float> floatVec;

vector<bool> boolVec;

vector<string> stringVec;

Thus we can create vectors of different types, just as we can create elementary arrays of different types.
But, also recall that a std::vector is not some magical entity—it is just a class with methods that
handle the internal dynamic memory array resizing. So the question is: how can we create a generic
class that can work with any type (or at least, some types), like std::vector can? The answer to this
question leads us to C++ templates and, more generally, generic programming.

Before continuing on, we would like to say that the subject of templates is vast, and we can only
introduce the basics in this chapter. For advanced/interested readers, we refer you to C++ Templates:
The Complete Guide by David Vandevoorde and Nicolai M. Josuttis. This book should prove to be an
excellent resource for you and is a highly recommended supplement to the material we will study in this
chapter.

Chapter Objectives

• Learn how to design and implement generic classes.

• Learn how to define generic functions.

3
10.1 Class Templates
Consider this small data structure, which represents an interval [a, b]:
struct FloatInterval
{
FloatInterval();
FloatInterval(float start, float end);

float midpoint();

float a;
float b;
};

FloatInterval::FloatInterval()
{
a = 0.0f;
b = 0.0f;
}

FloatInterval::FloatInterval(float start, float end)


{
a = start;
b = end;
}

float FloatInterval::midpoint()
{
// return the midpoint between a and b.
return (a + b) * 0.5;
}

Although very simple, it is not hard to imagine the need for other types of intervals. For example, we
may want to describe integer intervals, character intervals, 3D vector intervals, and color intervals (color
values between two colors). The most obvious solution would be just to define these additional interval
classes. Here are a few of them:
struct IntInterval
{
IntInterval();
IntInterval(int start, int end);

int midpoint();

int a;
int b;
};

IntInterval::IntInterval()
{
a = 0.0f;
b = 0.0f;
}

4
IntInterval::IntInterval(int start, int end)
{
a = start;
b = end;
}

int IntInterval::midpoint()
{
// return the midpoint between a and b.
return (a + b) * 0.5;
}

struct CharInterval
{
CharInterval();
CharInterval(char start, char end);

char midpoint();
char a;
char b;
};

CharInterval::CharInterval()
{
a = 0.0f;
b = 0.0f;
}

CharInterval::CharInterval(char start, char end)


{
a = start;
b = end;
}

char FloatInterval::midpoint()
{
// return the midpoint between a and b.
return (a + b) * 0.5;
}

This approach results in a lot of additional code. Moreover, we may need to create new interval types
later on, and we would then have to define additional classes. It does not take long to realize that this
process can become cumbersome pretty quickly.

Let us instead analyze the interval class to see if we can make any observations that will help us simplify
our task. We note that the only difference between FloatInterval and IntInterval is that
everywhere we see a float in FloatInterval, we see an int in IntInterval—and similarly with
FloatInterval and CharInterval. That is, these classes are essentially the same—only the type
they work with is different.

This gives us an idea. We could create a generic Interval class using a variable-type like so:

5
Struct Interval
{
Interval();
Interval(variable-type start, variable-type end);

variable-type midpoint();

variable-type a;
variable-type b;
};

Interval::Interval()
{
a = 0.0f;
b = 0.0f;
}

Interval::Interval(variable-type start, variable-type end)


{
a = start;
b = end;
}
variable-type Interval::midpoint()
{
// return the midpoint between a and b.
return (a + b) * 0.5;
}

Then, if we could specify a type-argument, we could generate new Interval classes that worked the
same way, but with different types. All we have to do is substitute the type-argument for the variable-
type. For example, if we specified type float as the type argument (assume argument types are
specified in angle brackets < >), then the following class would be generated:

Interval<float> ==
struct Interval
{
Interval();
Interval(float start, float end);

float midpoint();

float a;
float b;
};

Note: The previous two code boxes do not use actual C++ syntax (though it is similar); pseudo-code
was used to illustrate the idea of how template classes work.

This behavior is exactly what template classes allow us to do. Returning to std::vector, when we
specify the type in the angle brackets, we instruct the compiler to create a vector class based on the
specified type by substituting the type-argument (type in angle brackets) into the type-variables of the
template vector class.

6
10.1.1 Class Template Definition

Now that we know what we would use templates for and the basic idea behind how they work, let us
examine the actual C++ template syntax. Here is how we would define a template Interval class in
C++:
template <typename T>
struct Interval
{
Interval();
Interval(T start, T end);

T midpoint();

T a;
T b;
};

The first line, template <typename T> indicates that the class is a template class. The parameter
inside the angle brackets <typename T> denotes a variable-type name—in this case, we named the
variable-type, T. Later, when we want to instantiate an Interval of, say, ints, the compiler will
substitute int everywhere there is a T.

10.1.2 Class Template Implementation

There is some special syntax required when implementing the methods of a template class. In particular,
we must prefix the method with the template <typename T> syntax, and refer to the class name as
ClassName<T>. The following shows how we would implement the methods of Interval:

template <typename T>


Interval<T>::Interval()
{
a = T(); // Initialize with default
b = T(); // constructors of whatever type.
}

template <typename T>


Interval<T>::Interval(T start, T end)
{
a = start;
b = end;
}

template <typename T>


T Interval<T>::midpoint()
{
return (a + b) * 0.5; // return the midpoint between a and b.
}

Again, observe how we use T to refer to the type, which will eventually be substituted into the template.
Note: The template functionality of C++ is not easy for compiler writers to implement.

7
10.1.3 Class Template Instantiation

We have already instantiated template classes earlier in Module I of this course, without your even
realizing it. For example, the following code generates two classes:
vector<int> intVec;
vector<float> floatVec;

It generates a vector class, where type int is substituted into the typename parameter, and it
generates a second vector class, where type float is substituted into the typename parameter. The
compiler generates these classes at compile time—after all, we specify the type-argument at compile
time. Once the int-vector and float-vector classes are generated (remember, generating these
classes is merely a matter of substituting the typename variable-type with the specified argument-
type), we can create instances of them. That is what intVec and floatVec are—they are instances of
the matching vector class generated by the compiler.

Note: To further clarify, classes of a particular type are generated only once. That is, if you write:

vector<float> f1;
vector<float> f2;

A float version of vector is not generated twice—it only needs to be generated once to instantiate
any number of float-vector object instances.

With our template Interval class defined and implemented, we can instantiate objects of various types
the same way we do with std::vector:

Interval<float> floatInterval(0.0f, 10.0f);


Interval<int> intInterval(2, 4);

float fMidPt = floatInterval.midpoint();


int iMidPt = intInterval.midpoint();

cout << "fMidPt = " << fMidPt << endl;


cout << "iMidPt = " << iMidPt << endl;

Note: A class can contain more than one typename. For example, we can define a class like so:

template <typename T1, typename T2>


struct Foo
{
T1 a;
T2 b;
};

When we instantiate a member, we have to specify two types:

Foo<float, int> foo;

The above substitutes float for T1, and int for T2.

8
10.2 Example: A Table Template Class

For additional template practice, we will create a template Table class. A Table is sort of like
std::vector, except that instead of representing a resizable array, it represents a resizable 2D array—
or matrix. This table class will be very useful, as there are many datasets in game development that are
represented by a table (a game board/grid and 2D image immediately come to mind). We will want
tables of many kinds of data types, so naturally we will make a template Table class.

10.2.1 Table Data

As we start off the design of our Table class, let us first discuss how we shall represent our table. For
starters, our table size will not be fixed—it will have m rows and n columns. Since the number of rows
and columns is variable, we must use dynamic memory. In this case, we use a pointer to an array of
pointers to arrays.

This probably sounds confusing, and it is definitely a bit tricky at first, but it will be pretty intuitive once
you think about it. We first have a pointer to an array, which we allocate dynamically. This array
describes the rows of the table. Now each element in this array is also a pointer. These pointers, in turn,
each point to another dynamic array, which forms the columns of the table. Figure 10.1 illustrates.

Figure 10.1: A 5x7 table represented with a pointer to an array of pointers to arrays. That is, we first have a pointer
to a “row” array. Each element in this row array, in turn, points to a “column,” thereby forming a 2D table.

9
Essentially, to have a variable sized 1D array, we needed one pointer to an array. To have a variable
sized 2D array (variable in both rows and columns), we need a pointer to an array of pointers to arrays.

Furthermore, we will want to maintain the number of rows and columns our table has. This yields the
following data members:

int mNumRows;
int mNumCols;
T** mDataMatrix;

The double star notation ** means “pointer to a pointer.” This is how we can describe a pointer to an
array of pointers to arrays.

10.2.2 Class Interface

As far as methods go, we need to be able to resize a table, construct tables, get the number of rows and
columns a table has, provide access to entries in the table, and overload the assignment operator and
copy constructor to provide deep copies since our class contains pointer data. The following definition
provides these features via the interface:

template <typename T>


class Table
{
public:
Table();
Table(int m, int n);
Table(int m, int n, const T& value);
Table(const Table<T>& rhs);
~Table();

Table<T>& operator=(const Table& rhs);


T& operator()(int i, int j);

int numRows()const;
int numCols()const;

void resize(int m, int n);


void resize(int m, int n, const T& value);

private:
// Make private because this method should only be used
// internally by the class.
void destroy();

private:
int mNumRows;
int mNumCols;
T** mDataMatrix;
};

10
The next three subsections discuss three non-trivial methods of Table. The implementations for the rest
of the methods are shown in Section 10.2.6.

10.2.3 The destroy Method

The first method we will examine is the destroy method. This method is responsible for destroying
the dynamic memory allocated by a Table object. What makes this method a bit tricky is the pointer to
an array of pointers to arrays, which stores our table data. The method is implemented as follows:

template <typename T>


void Table<T>::destroy()
{
// Does the matrix exist?
if( mDataMatrix )
{
// Iterate over each row i.
for(int i = 0; i < _m; ++i)
{
// Does the ith column array exist?
if(mDataMatrix[i] )
{
// Yes, delete it.
delete[]mDataMatrix[i];
mDataMatrix[i] = 0;
}
}
// Now delete the row-array.
delete[] mDataMatrix;
mDataMatrix = 0;
}

// Table was destroyed, so dimensions are zero.


mNumRows = 0;
mNumCols = 0;
}

Be sure to read the comments slowly and deliberately. First, we traverse over each row and delete the
column array that exists in each element of the row array (See Figure 10.1). Once we have deleted the
column arrays, we delete the row array.

10.2.4 The resize Method

In this section, we examine the resize method, which is relatively more complicated than the other
methods of the Table class. This method is somewhat tricky because it handles the memory allocation
of the pointer to an array of pointers to arrays; the method is presented below:

11
template <typename T>
void Table<T>::resize(int m, int n, const T& value)
{
// Destroy the previous data.
destroy();

// Save dimensions.
mNumRows = m;
mNumCols = n;

// Allocate a row (array) of pointers.


mDataMatrix = new T*[mNumRows];

// Now, loop through each pointer in this row array.


for(int i = 0; i < mNumRows; ++i)
{
// And allocate a column (array) for the ith row to build
// the table.
mDataMatrix[i] = new T[mNumCols];

// Now loop through each element in this row[i]


// and copy 'value' into it.
for(int j = 0; j < mNumCols; ++j)
mDataMatrix[i][j] = value;
}
}

Again, be sure to read the comments slowly and deliberately. The method takes three parameters: the
first two specify the dimensions of the table; that is m by n. The third parameter is a default value to
which we initialize all the elements of the table.

The very first thing the method does is call the destroy method, as discussed in Section 10.2.3. This
makes one thing immediately clear -- we lose the data in the table whenever we call resize. If you
want to maintain the data, you will need to copy it into a separate table for temporary storage, resize the
current table, and then copy the data in the temporary storage back into the newly resized table.

After the resize method, we simply save the new dimensions. The next line:

// Allocate a row (array) of pointers.


mDataMatrix = new T*[mNumRows];

allocates an array of pointers (see the row in Figure 10.1). What we must do now is iterate over each of
these pointers and allocate the column array:

// Now, loop through each pointer in this row array.


for(int i = 0; i < mNumRows; ++i)
{
// And allocate a column (array) for the ith row to build
// the table.
mDataMatrix[i] = new T[mNumCols];

12
After we have done this, we iterate over each column in the i-th row, and initialize the table entry with
value:

// Now loop through each element in this row[i]


// and copy 'value' into it.
for(int j = 0; j < mNumCols; ++j)
mDataMatrix[i][j] = value;

On the whole, it is not too complex if you break the method down into parts, and use Figure 10.1 as a
guide.

10.2.5 The Overloaded Parenthesis Operator

The final method we wish to discuss is the overloaded parenthesis operator. Although the
implementation is straightforward, we draw attention to this method because we have not overloaded the
parenthesis operator before.

template <typename T>


T& Table<T>::operator()(int i, int j)
{
return mDataMatrix[i][j];
}

Because C++ does not have a double bracket operator [][], which we can overload, we cannot index into
a table as we would a 2D array. We instead overload the parenthesis operator to take two arguments,
and instruct the method to use these arguments to index into the internal 2D array, in order to return the
i-th table entry. This allows us to index into a table “almost” like the double bracket operator would:

Table<float> myTable(4, 4);

MyTable(1, 1) = 2.0f; // Access entry [1][1]


MyTable(3, 0) = -1.0f; // Access entry [3][0]

10.2.6 The Table Class

For reference, we provide the entire Table definition and implementation together here. Note in
particular how the definition and implementation are in the same file—this is necessary for templates.
You will be asked to use this class in one of the exercises, so be sure to give it a thorough examination.

// Table.h
#ifndef TABLE_H
#define TABLE_H

template <typename T>


class Table
{

13
public:
Table();
Table(int m, int n);
Table(int m, int n, const T& value);
Table(const Table<T>& rhs);
~Table();

Table<T>& operator=(const Table& rhs);


T& operator()(int i, int j);

int numRows()const;
int numCols()const;

void resize(int m, int n);


void resize(int m, int n, const T& value);

private:
// Make private because this method should only be used
// internally by the class.
void destroy();

private:
int mNumRows;
int mNumCols;
T** mDataMatrix;
};

template <typename T>


Table<T>::Table<T>()
{
mDataMatrix = 0;
mNumRows = 0;
mNumCols = 0;
}

template <typename T>


Table<T>::Table<T>(int m, int n)
{
mDataMatrix = 0;
mNumRows = 0;
mNumCols = 0;
resize(m, n, T());
}

template <typename T>


Table<T>::Table<T>(int m, int n, const T& value)
{
mDataMatrix = 0;
mNumRows = 0;
mNumCols = 0;
resize(m, n, value);
}

template <typename T>


Table<T>::Table<T>(const Table<T>& rhs)
{
mDataMatrix = 0;

14
mNumRows = 0;
mNumCols = 0;
*this = rhs;
}

template <typename T>


Table<T>::~Table<T>()
{
// Destroy any previous dynamic memory.
destroy();
}

template <typename T>


Table<T>& Table<T>::operator=(const Table& rhs)
{
// Check for self assignment.
if( this == &rhs ) return *this;

// Reallocate the table based on rhs info.


resize(rhs.mNumRows, rhs.mNumCols);

// Copy the entries over element-by-element.


for(int i = 0; i < mNumRows; ++i)
for(int j = 0; j < mNumCols; ++j)
mDataMatrix[i][j] = rhs.mDataMatrix[i][j];

// return a reference to *this so we can do chain


// assignments: x = y = z = w = ...
return *this;
}

template <typename T>


T& Table<T>::operator()(int i, int j)
{
return mDataMatrix[i][j]; // return the ijth table entry.
}

template <typename T>


int Table<T>::numRows()const
{
return mNumRows; // Return the number of rows.

template <typename T>


int Table<T>::numCols()const
{
return mNumCols; // Return the number of columns.
}

template <typename T>


void Table<T>::resize(int m, int n)
{
// Call resize and use default constructor T()
// as 'value'.
resize(m, n, T());
}

15
template <typename T>
void Table<T>::resize(int m, int n, const T& value)
{
// Destroy the previous data.
destroy();

// Save dimensions.
mNumRows = m;
mNumCols = n;

// Allocate a row (array) of pointers.


mDataMatrix = new T*[mNumRows];

// Now, loop through each pointer in this row array.


for(int i = 0; i < mNumRows; ++i)
{
// And allocate a column (array) to build the table.
mDataMatrix[i] = new T[mNumCols];

// Now loop through each element in this row[i]


// and copy 'value' into it.
for(int j = 0; j < mNumCols; ++j)
mDataMatrix[i][j] = value;
}
}
template <typename T>
void Table<T>::destroy()
{
// Does the matrix exist?
if( mDataMatrix )
{
for(int i = 0; i < _m; ++i)
{
// Does the ith row exist?
if(mDataMatrix[i] )
{
// Yes, delete it.
delete[]mDataMatrix[i];
mDataMatrix[i] = 0;
}
}
// Delete the row-array.
delete[] mDataMatrix;
mDataMatrix = 0;
}

mNumRows = 0;
mNumCols = 0;
}

#endif // TABLE_H

16
10.3 Function Templates
Template functions extend the idea of template classes. Sometimes you will have a function which
performs an operation that can be performed on a variety of data types. For example, consider a search
function; naturally, we will want to search arrays of all kinds of data types. It would be cumbersome to
implement a search function for each type, especially since the implementation would essentially be the
same—only the types would be different. So a search function is a good candidate for a template
design.

The general syntax of a function template is as follows:

template <typename T>


return-type FunctionName(parameter-list...)
{
// Function body
}

Next we see two template function examples, one that performs a linear search and a second template
function that prints an array.

template <typename T>


int LinearSearch(T dataArray[], int arraySize, T searchItem)
{
// Search through array.
for(int i = 0; i < arraySize; ++i)
{
// Find it?
if( dataArray[i] == searchItem )
{
// Yes, return the index we found it at.
return i;
}
}

// Did not find it, return -1.


return -1;
}

template <typename T>


void Print(T data[], int arraySize)
{
for(int i = 0; i < arraySize; ++i)
cout << data[i] << " ";
cout << endl;
}

The only operator LinearSearch uses on the type T is the equals == operator. Thus, any type we use
with LinearSearch (i.e., substitute in for T) must have that operator defined (i.e., overloaded). All the
built-in types have the equals operator defined, so they pose no problem, and similarly with

17
std::string. But if we wish to use user-defined types (i.e., classes) we must overload the equals
operator if we want to be able to use LinearSearch with them.

Similarly, the only operator Print uses on T is the insertion operator. Thus, any type we use with
Print (i.e., substitute in for T) must have that operator defined (i.e., overloaded). All the built-in types
have the insertion operator defined, so they pose no problem, and similarly with std::string. But if
we wish to use user-defined types (i.e., classes) we must overload the insertion operator if we want to be
able to use Print with them.

10.3.1 Example Program

What follows is a sample program illustrating our template functions. We set up two arrays, a
std::string array, and an int array. We then use the Print function to print both of these arrays,
and we allow the user to search these arrays via LinearSearch. The key idea here is that we are using
the same template function for different types—that is, these functions are generic and work on any
types that implement the stated conditions (overloads the less than operator/insertion operator).

Program 10.1: Template Functions.


#include <iostream>
#include <string>
using namespace std;

template <typename T>


int LinearSearch(T dataArray[], int arraySize, T searchItem)
{
// Search through array.
for(int i = 0; i < arraySize; ++i)
{
// Find it?
if( dataArray[i] == searchItem )
{
// Yes, return the index we found it at.
return i;
}
}

// Did not find it, return -1.


return -1;
}

template <typename T>


void Print(T data[], int arraySize)
{
for(int i = 0; i < arraySize; ++i)
cout << data[i] << " ";
cout << endl;
}

18
int main()
{
string sArray[8] =
{
"delta",
"lambda",
"alpha",
"beta",
"pi",
"omega",
"epsilon",
"phi"
};
int numStrings = 8;

int iArray[14] = {7,3,32,2,55,34,6,13,29,22,11,9,1,5};


int numInts = 14;

int index = -1;

bool quit = false;


while( !quit )
{
//=======================================
// String search.

Print(sArray, numStrings);

string str = "";


cout << "Enter a string to search for: ";
cin >> str;

index = LinearSearch(sArray, numStrings, str);

if( index != -1 )
cout << str << " found at index " << index << endl;
else
cout << str << " not found." << endl;
cout << endl;

//=======================================
// Int search.

Print(iArray, numInts);

int integer = 0;
cout << "Enter an integer to search for: ";
cin >> integer;

index = LinearSearch(iArray, numInts, integer);

if( index != -1 )
cout << integer << " found at index " << index<<endl;
else
cout << integer << " not found." << endl;
cout << endl;

19
//=======================================
// Search again?

char input = '\0';


cout << "Quit? (y)/(n)";
cin >> input;

if( input == 'y' || input == 'Y' )


quit = true;
}
}

Program 10.1 Output

delta lambda alpha beta pi omega epsilon phi


Enter a string to search for: temp
temp not found.

7 3 32 2 55 34 6 13 29 22 11 9 1 5
Enter an integer to search for: 32
32 found at index 2

Quit? (y)/(n)n
delta lambda alpha beta pi omega epsilon phi
Enter a string to search for: beta
beta found at index 3

7 3 32 2 55 34 6 13 29 22 11 9 1 5
Enter an integer to search for: 22
22 found at index 9

Quit? (y)/(n)n
delta lambda alpha beta pi omega epsilon phi
Enter a string to search for: phi
phi found at index 7

7 3 32 2 55 34 6 13 29 22 11 9 1 5
Enter an integer to search for: 0
0 not found.

Quit? (y)/(n)y
Press any key to continue

20
10.4 Summary
Sometimes we would like to create several versions of a class, where the only difference is the data
types involved. Template classes enable us to do this. Specifically, we create a generic class built using
generic type-variables, where we can then substitute real concrete types into these type-variables to form
new classes. The compiler forms these new classes at compile time. Template classes reduce the
number of classes that the programmer must explicitly write, and therefore, they save time and reduce
program size/complexity.

1. Template functions are generic and can work on any data type that implements the operations
used inside the function body. In this way, we can write one generic function that works for
several types, instead of a unique function for each type. Template functions reduce the number
of functions that the programmer must explicitly write, and therefore, they save time and reduce
program size/complexity.

2. Use templates for classes and functions, which can be generalized to work with more than one
type. std::vector, Table and LinearSearch are examples of classes and functions which
can be generalized in this fashion. The following exercises illustrate a few more examples, and
Chapter 13, on the STL, demonstrates a very sophisticated generic programming design.

10.5 Exercises

10.5.1 Template Array Class

Reconsider the exercise from Section 7.9.2, where you were instructed to implement a resizable
FloatArray class:

// FloatArray.h
#ifndef FLOAT_ARRAY_H
#define FLOAT_ARRAY_H

class FloatArray
{
public:
// Create a FloatArray with zero elements.
FloatArray();

// Create a FloatArray with 'size' elements.


FloatArray(int size);

// Create a FloatArray from another FloatArray--


// be sure to prevent memory leaks!
FloatArray(const FloatArray& rhs);

21
// Free dynamic memory.
~FloatArray();

// Define how a FloatArray shall be assigned to


// another FloatArray--be sure to prevent memory
// leaks!
FloatArray& operator=(const FloatArray& rhs);

// Resize the FloatArray to a new size.


void resize(int newSize);

// Return the number of elements in the array.


int size();

// Overload bracket operator so client can index


// into FloatArray objects and access the elements.
float& operator[](int i);

private:
float* mData; // Pointer to array of floats (dynamic memory).
int mSize; // The number of elements in the array.
};

#endif // FLOAT_ARRAY_H

The problem with this class is that it only works with the float type. However, we would naturally
want resizable arrays of any type of object. Generalize the class with templates so that it can be used
with any type. Test your program by creating a std::string Array, and an int Array, from the
generic template class. Call the template class Array.

10.5.2 Template Bubble Sort Function

Reconsider the exercise from Section 3.7.8, where you were instructed to implement a Bubble Sort
function like so:

void BubbleSort(int data[], int n);

The problem with this function is that it only works with the int type; however, we would naturally
want to sort arrays of any type of object. Generalize the function with templates so that it can be used
with any type that implements the operations (e.g., less than, greater than, etc.) needed to implement the
bubble sort algorithm. Test your program by sorting a std::string array, and an int array, with the
template BubbleSort function.

10.5.3 Table Driver

Rewrite the exercise from Section 2.7.5, but instead use the Table class as discussed in Section 10.2,
instead of 2D arrays.

22
Chapter 11

Errors and Exception Handling

23
Introduction
Throughout most of the previous chapters, we have assumed that all of our code was designed and
implemented correctly and that the results could be anticipated. For example, we assumed that the user
entered the expected kind of input, such as a string when a string was expected or a number when a
number was expected. Additionally, we assumed that the arguments we passed into function parameters
were valid. But this may not always be true. For example, what happens if we pass in a negative integer
into a factorial function, which expects an integer greater than or equal to zero? Whenever we allocated
memory, we assumed that the memory allocation succeeded, but this is not always true, because
memory is finite and can run out. While we copied strings with strcpy, we assumed the destination
string receiving the copy had enough characters to store a copy, but what would happen if it did not?

It would be desirable if everything worked according to plan; however, in reality things tend to obey
Murphy’s Law (which paraphrased says “if anything can go wrong, it will”). In this chapter, we spend
some time getting familiar with several ways in which we can catch and handle errors. The overall goal
is to write code that is easy to debug, can (possibly) recover from errors, and exits gracefully with useful
error information if the program encounters a fatal error.

Chapter Objectives

• Understand the method of catching errors via function return codes, and an understanding of the
shortcomings of this method.
• Become familiar with the concepts of exception handling, its syntax, and its benefits.
• Learn how to write assumption verification code using asserts.

11.1 Error Codes


The method of using error codes is simple. For every function or method we write, we have it return a
value which signifies whether the function/method executed successfully or not. If it succeeded then we
return a code that signifies success. If it failed then we return a predefined value that specifies where
and why the function/method failed.

Let us take a moment to look at a real world example of an error return code system. In particular, we
will look at the system used by DirectX (a code library for adding graphics, sound, and input to your
applications). Consider the following DirectX function:

HRESULT WINAPI D3DXCreateTextureFromFile(


LPDIRECT3DDEVICE9 pDevice,
LPCTSTR pSrcFile,
LPDIRECT3DTEXTURE9 *ppTexture
);

24
Do not worry about what this function does or the data types this function uses, which you are not
familiar with.

This function has a return type HRESULT, which is simply a numeric code that identifies the success of
the function or an error. For instance, D3DXCreateTextureFromFile can return one of the following
return codes, which are defined numerically (i.e., the symbolic name represents a number). Which one
it returns depends upon what happens inside the function.

• D3D_OK: This return code means that the function executed completely successfully.

• D3DERR_NOTAVAILABLE: This return code means that the hardware cannot create a texture; that
is, texture creation is an “unavailable” feature. This is a failure code.

• D3DERR_OUTOFVIDEOMEMORY: This return code means that there is not enough video memory
to put the texture in. This is a failure code.

• D3DERR_INVALIDCALL: This return code means that the arguments passed into the parameters
are invalid. For example, you may have passed in a null pointer when the function expects a
valid pointer. This is a failure code.

• D3DXERR_INVALIDDATA: This return code means the source data (that is, the texture file) is not
valid. This error could occur if the file is corrupt, or we specified a file that is not actually a
texture file. This is a failure code.

• E_OUTOFMEMORY: This return code means there was not enough available memory to perform
the operation. This is a failure code.

By examining the return codes from functions that return error codes, we can figure out if an error
occurred, what potentially caused the error, and then respond appropriately. For example, we can write
the following code:

HRESULT hr = D3DXCreateTextureFromFile([...]);

// Did an error occur?


if( hr != D3D_OK )
{
// Yes, find our which specific error
if( hr == D3DERR_NOTAVAILABLE )
{
DisplayErrorMsg("D3DERR_NOTAVAILABLE");
ExitProgram();
}
else if( hr == D3DERR_OUTOFVIDEOMEMORY )
{
DisplayErrorMsg("D3DERR_OUTOFVIDEOMEMORY");
ExitProgram();
}
else if( hr == D3DERR_INVALIDCALL )
{

25
DisplayErrorMsg("D3DERR_INVALIDCALL");
ExitProgram();
}
else if( hr == D3DXERR_INVALIDDATA )
{
DisplayErrorMsg("D3DXERR_INVALIDDATA");
ExitProgram();
}
else if( hr == E_OUTOFMEMORY )
{
DisplayErrorMsg("E_OUTOFMEMORY");
ExitProgram();
}
}

Here we simply display the error code to the user and then exit the program. Note that
DisplayErrorMsg and ExitProgram are functions you would have to implement yourself. They are
not part of the standard library.

11.2 Exception Handling Basics


One of the shortcomings of error codes is that for a single function call, we end up writing a lot of error
handling code, thereby bloating the size of the program. For example, at the end of the previous section
we saw that there were many lines of error handling code for a single function call. The problem
becomes worse on a larger scale:
FunctionCallA();
// Handle possible error codes

FunctionCallB();
// Handle possible error codes

FunctionCallC();
// Handle possible error codes
...

Such a style of mixing error-handling code in with non-error-handling code becomes so cumbersome
that it is seldom religiously followed throughout a program, and therefore, the program becomes unsafe.
C++ provides an alternative error-handling solution called exception handling.

Exception handling works like this: in a segment of code, if an error or something unexpected occurs,
the code throws an exception. An exception is represented with a class object, and as such, can do
anything a normal C++ class object can do. Once an exception has been thrown, the call stack unwinds
(a bit like returning from functions) until it finds a catch block that handles the exception. Let us look at
an example:

26
Program 11.1: Exception Handling.
#include <iostream>
#include <string>
using namespace std;

class DivideByZero
{
public:
DivideByZero(const string& s);

void errorMsg();

private:
string mErrorMsg;
};

DivideByZero::DivideByZero(const string& s)
{
mErrorMsg = s;
}

void DivideByZero::errorMsg()
{
cout << mErrorMsg << endl;
}

float Divide(float numerator, float denominator)


{
if( denominator == 0.0f )
throw DivideByZero("Divide by zero: result undefined");

return numerator / denominator;


}

int main()
{
try
{
float quotient = Divide(12.0f, 0.0f);
cout << "12 / 0 = " << quotient << endl;
}
catch(DivideByZero& e)
{
e.errorMsg();
}
}

Program 11.1 Output

Divide by zero: result undefined


Press any key to continue

The very first thing we do is define an exception class called DivideByZero. Remember that an
exception class is just like an ordinary class, except that we use instances of it to represent exceptions.

27
The next item of importance is in the Divide function. This function tests for a “divide by zero” and if
it occurs, we then construct and throw a DivideByZero object exception. Finally, in the main
function, in order to catch an exception we must use a try-catch block. In particular, we wrap the code
that can potentially throw an exception in the try block, and we write the exception handling code in
the catch block. Note that the catch block takes an object. This object is the exception we are
looking to catch and handle.

It is definitely possible, and quite common, that a function or method will throw more than one kind of
exception. We can list catch statements so that we can handle the different kinds of exceptions:

try
{
SomeFunction();
}
catch(LogicError& logic)
{
// Handle logic error exception
}
catch(OutOfMemory& outOfMem)
{
// Handle out of memory exception
}
catch(InvalidData& invalid)
{
// Handle invalid data
}

In addition to a chain of catches, we can “catch any exception” by specifying an ellipses argument:

try{
SomeFunction();
}
catch(...){
// Generic error handling code
}

We can state two immediate benefits of exception handling.


1. The error-handling code (i.e., the catch block) is not intertwined with non-error-handling code; in
other words, we move all error handling code into a catch block. This is convenient from an
organizational standpoint.
2. We need not handle a thrown exception immediately; rather the stack will unwind until it finds a
catch block that handles the exception. This is convenient because, as functions can call other
functions, which call other functions, and so on, we do not want to have error handling code after
every function/method. Instead, with exceptions we can catch the exception at, say, the top level
function call, and any exception thrown in the inner function calls will eventually percolate up to
the top function call which can catch the error.

As a final note, be aware that this section merely touched on the basics of exception handling, and there
are many more details and special situations that can exist. Also note that the functionality of exception
handling is not free, and introduces some (typically minor) performance overhead.

28
11.3 Assert
In general, your functions and methods make certain assumptions. For example, a “print array” function
might assume that the program passes a valid array argument. However, it is possible that you might
have forgotten to initialize an array, and consequently, passed in a null pointer to the “print array”
function, thus causing an error. We could handle this problem with a traditional error handling system
as described in the previous two sections. However, such errors should not be occurring as the program
reaches completion. That is, if you are shipping a product that has a null pointer because you forgot to
initialize it then you should not be shipping the product to begin with. Error handling should be for
handling errors that are generally beyond the control of the program, such as missing or corrupt data
resources, incompatible hardware, unavailable memory, flawed input data, and so on.

Still, for debugging purposes, it is very convenient to have self-checks littered throughout the program
to ensure certain assumptions are true, such as the validity of a pointer. However, based on the previous
argument, we should not need these self-checks once we have agreed that the software is complete. In
other words, we want to remove these checks in the final version of the program. This is where assert
comes in.

To use the assert function you must include the standard library <cassert>. The assert function
takes a single boolean expression as an argument. If the expression is true then the assertion passes;
what was asserted is true. Conversely, if the expression evaluates to false then the assertion fails and a
dialog box like the one depicted in Figure 11.1 shows up, along with an assertion message in the console
window:

Figure 11.1: Assert message and dialog.

29
The information the assertion prints to the console is quite useful for debugging; it displays the condition
that failed, and it displays the source code file and line number of the condition that failed.

The key fact about asserts is that they are only used in the debug version of a program. When you
switch the compiler into “release mode” the assert functions are filtered out. This satisfies what we
previously sought when we said: “[…] we want to remove these checks [asserts] in the final version
of the program.”

To conclude, let us look at a complete, albeit simple, program that uses asserts.

Program 11.2: Using assert.


#include <iostream>
#include <cassert>
#include <string>
using namespace std;

void PrintIntArray(int array[], int size)


{
assert( array != 0 ); // Check for null array.
assert( size >= 1 ); // Check for a size >= 0.

for(int i = 0; i < size; ++i)


cout << array[i] << " ";

cout << endl;


}
int main()
{
int* array = 0;

PrintIntArray(array, 10);
}

The function PrintIntArray makes two assumptions:

1) The array argument points to something (i.e., it is not null)


2) The array has a size of at least one element.

Both of these assumptions are asserted in code:

// Check for null array.


assert( array != 0 );

// Check for a size >= 0.


assert( size >= 1 );

Because we pass a null pointer into PrintIntArray, in main, the assert fails and the dialog box and
assert message as shown in Figure 11.1 appear. As an exercise, correct the problem and verify that the
assertion succeeds.

30
11.4 Summary
1. When using error codes to handle errors for every function or method we write, we have it return
a value, which signifies whether the function/method executed successfully or not. If it
succeeded then we return a code that signifies success. If it failed then we return a predefined
value that specifies where and why the function/method failed. One of the shortcomings of error
codes is that for a single function call, we end up writing much more error handling code,
thereby bloating the size of the program.

2. Exception handling works like this: in a segment of code, if an error or something unexpected
occurs, the code throws an exception. An exception is represented with a class object, and as
such, can do anything a normal C++ class object can do. Once an exception has been thrown,
the stack unwinds (a bit like returning from functions) until it finds a catch block that handles the
exception. One of the benefits of exception handling is that the error-handling code (i.e., the
catch block) is not intertwined with non-error-handling code; in other words, we move all error
handling code into a catch block. This is convenient from an organizational standpoint. Another
benefit of exception handling is that we need not handle a thrown exception immediately; rather
the stack will unwind until it finds a catch block that handles the exception. This is convenient
because, as functions can call other functions, which call other functions, and so on, we do not
want to have error handling code after every function/method. Instead, with exceptions we can
catch the exception at the top level function call, and any exception thrown in the inner function
calls will eventually percolate up to the top function call which can catch the error. Be aware
that the functionality of exception handling is not free, and introduces some performance
overhead.

3. To use the assert function, you must include the standard library <cassert>. The assert
function takes a single boolean expression as an argument. If the expression is true then the
assertion passes; what was asserted is true. Conversely, if the expression evaluates to false then
the assertion fails and a message is displayed along with a dialog box. The key fact about
asserts is that they are only used in the debug version of a program. When you switch the
compiler into “release mode” the assert functions are filtered out.

11.5 Exercises

11.5.1 Exception Handling

This is an open-ended exercise. You are to come up with some situation in which an exception could be
thrown. You then are to create an exception class representing that type of exception. Finally, you are
to write a program, where such an exception is thrown, and you should catch and handle the exception.
It does not have to be fancy. The goal of this exercise is for you to simply go through the process of
creating an exception class, throwing an exception, and catching an exception, at least once.

31
Chapter 12

Number Systems; Data


Representation; Bit Operations

33
Introduction
For the most part, with the closing of the last chapter, we have concluded covering the core C++ topics.
As far as C++ is concerned, all we have left is a tour of some additional elements of the standard library,
and in particular, the STL (standard template library). But first, we will take a detour and become
familiar with data at a lower level; more specifically, instead of looking at chars, ints, floats, etc.,
we will look at the individual bits that make up these types.

Chapter Objectives

• Learn how to represent numbers with the binary and hexadecimal numbering systems, how to
perform basic arithmetic in these numbering systems, and how to convert between these
numbering systems as well as the base ten numbering system.

• Gain an understanding of how the computer describes intrinsic C++ types internally.

• Become proficient with the various binary operations.

• Become familiar with the way in which floating-point numbers are represented internally.

12.1 Number Systems


We are all experienced with working in a base (or radix) ten number system, called the decimal number
system, where each digit has ten possible values ranging from 0-9. However, after some reflection, it is
not difficult to understand that selecting a base ten number system is completely arbitrary. Why ten?
Why not two, eight, sixteen, and so on? You might suggest that ten is a convenient number, but it is
only convenient because you have presumably worked in it your whole life.

Throughout this chapter, we will become familiar with two other specific number systems, particularly
the base two binary system and the base sixteen hexadecimal systems. We choose these systems
because they are convenient when working with computers, as will be made clear in Section 12.4.
These new numbering systems may be cumbersome to work with at first, but after a bit of practice you
will become very fast at manipulating numbers in these systems.

In order to distinguish between numbers in different systems, we will adopt a subscript notation when
the context might not be clear:

• n10 : The number n is in the decimal number system.


• n 2 : The number n is in the binary number system.
• n16 : The number n is in the hexadecimal number system.

34
12.1.1 The Windows Calculator

Microsoft Windows ships with a calculator program that can work in binary, octal (a base eight number
system we will not discuss), decimal, and hexadecimal. In addition to the arithmetic operations, the
program allows you switch (i.e., convert) from one system to the other by simply selecting a radio
button. Furthermore, the calculator program can even do logical bit operations AND, OR, NOT, XOR
(exclusive or), which we discuss in Section 12.5. Figures 12.1a-12.1e give a basic overview of the
program.

Figure 12.1a: The calculator program in “standard” view. To use the other number systems we need to switch to
“scientific” view.

Figure 12.1b: The calculator program in “scientific” view. Notice the four radio buttons, which allow us to switch
numbering systems any time we want.

35
Figure 12.1c: Here we enter a number in the decimal system. We also point out the logical bit operations AND, OR,
NOT, and XOR (exclusive or), which are discussed in Section 12.5.

Figure 12.1d: Here we switched from decimal to binary. That is, “11100001” in binary is “225” in decimal. So we can
input a number in any base we want and then convert that number into another base by simply selecting the radio
button that corresponds to the base we want to convert to. In addition, we also point out that the program
automatically limits you to two possible values in binary.

36
Figure 12.1e: Here we switched from binary to hexadecimal. That is, “11100001” in binary is “E1” in hexadecimal,
which is “225” in decimal. We also point out that there are now sixteen possible hexadecimal numbers to work with.
Do not worry too much about this now; we discuss hexadecimal in Section 12.3.

You can use this calculator program to check your work for the exercises.

12.2 The Binary Number System

12.2.1 Counting in Binary

The binary number system is a base two number system. This means that only two possible values per
digit exist; namely 0 and 1. In binary, we count similarly to the way we count in base ten. For example,
in base ten we count 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, and then, because we have run out of values, to count ten
we reset back to zero and add a new digit which we set to one, to form the number 10.

In binary, the concept is the same except that we only have two possible values per digit. Thus, we end
up having to “add” a new digit much sooner than we do in base ten. We count 0, 1, and then we already
need to add a new digit. Let us count a few numbers one-by-one in binary to get the idea. For each
number, we write the equivalent decimal number next to it.

37
0 2 = 010
12 = 110

There is no ‘2’ in binary—only 0 and 1—so at this point, we must add a new digit:

10 2 = 210
112 = 310

Again, we have run out of values in base two, so we must add another new digit to continue:

100 2 = 410
1012 = 510
110 2 = 610
1112 = 710
1000 2 = 810
10012 = 910
1010 2 = 1010
10112 = 1110
1100 2 = 1210
11012 = 1310
1110 2 = 1410
11112 = 1510
10000 2 = 1610

It takes time to become familiar with this system as it is easy to confuse the binary number 11112 for the
decimal number 111110 until your brain gets used to distinguishing between the two systems.

12.2.2 Binary and Powers of 2

An important observation about the binary number system is that each “digit place” corresponds to a
power of 2 in decimal:

12 = 210
0
= 110
10 2 = 2110 = 210
100 2 = 210
2
= 410
1000 2 = 210
3
= 810
10000 2 = 210
4
= 1610

38
100000 2 = 210
5
= 3210
1000000 2 = 210
6
= 6410
10000000 2 = 210
7
= 12810
100000000 2 = 210
8
= 25610
1000000000 2 = 210
9
= 51210
10000000000 2 = 210
10 = 102410

100000000000 2 = 211
10 = 204810

1000000000000 2 = 212
10 = 409610

You should memorize these binary to decimal powers of two up to 212 10 = 409610 , in the same way you

memorized your multiplication tables when you were young. You should be able to recollect them
quickly. This will allow you to convert binary numbers into decimal numbers and decimal numbers into
binary numbers quickly in your head.

As an aside, in base ten we have a similar pattern, but because we are in base ten, the powers are powers
of ten instead of powers of two:

110 = 1010
0

1010 = 10110
10010 = 1010
2

100010 = 1010
3

1000010 = 1010
4

12.2.3 Binary Arithmetic

We can add numbers in binary just like we can in decimal. Again, the only difference being that binary
only has two possible values per digit. Let us work out a few examples.

Addition

Example 1:
10
+ 1
-----
?

39
We add columns just like we do in decimal. The first column yields 0 + 1 = 1, and the second also 1 + 0
= 1. Thus,

10
+ 1
-----
11

Example 2:

101
+ 11
------
?

Adding columns from right to left, we have 1 + 1 = 10 in binary for the first column. So we write zero
for this column and carry a one over to the next digit place:

1
101
+ 11
------
0

Adding the second column leads to the previous situation, namely, 1 + 1 = 10. So we write zero for this
column and carry a one over to the next digit place:

11
101
+ 11
------
00

Adding the third column again leads to the previous situation, namely, 1 + 1 = 10. So we write zero for
this column and carry a one over to the next digit place, yielding our final answer:

11
101
+ 11
------
1000

Example 3:

10110
+ 101
--------
?

Adding the first column (right most column) we have 0 + 1 = 1. So we write 1 for this column:

40
10110
+ 101
--------
1

Adding the second column, we again have 1 + 0 = 1:

10110
+ 101
--------
11

The third column yields 1 + 1 = 10, so we write zero for this column and carry over 1 to the next digit
place:

1
10110
+ 101
--------
011

Add the fourth and fifth columns both yield 1 + 0 = 1:

1
10110
+ 101
--------
11011

Subtraction

Example 4:

10
- 1
-----
?

We subtract the columns from right to left as we do in decimal. In this first case we must “borrow” like
we do in decimal:
10
00
- 1
-----
?

Now 10 – 1 in binary is 1, thereby giving the answer:

41
10
00
- 1
-----
1

Example 5:

101
- 11
------
?

Subtracting the first column we have 1 – 1 = 0. So we write one in the first column:

101
- 11
------
0

In the second column, we must borrow again yielding:


10
001
- 11
------
10

Example 6:

10110
- 101
--------
?

Here the first column must borrow, and then 10 – 1 = 1:


10
10100
- 101
--------
1

In the second column we now have 0 – 0 = 0, in the third column we have 1 – 1 = 0, in the fourth
column we have 0 – 0 = 0, and in the fifth column we have 1 – 0 = 1, which gives the answer:
10
10100
- 101
--------
10001

42
Multiplication

Multiplying in binary is the same as in decimal; except all of our products have only four possible
forms: 0 × 0 , 0 × 1 , 1× 0 , and 1× 1 . As such, binary multiplication is pretty easy.

Example 7:

10
x 1
-----
10

Example 8:

101
x 11
------
101
+1010
------
1111

Example 9:

10110
x 101
--------
10110
000000
+1011000
---------
1101110

12.2.4 Converting Binary to Decimal

There is a mechanical formula, which can be used to convert from binary to decimal, and it is useful for
large numbers. However, in practice, we do not typically need to work with large numbers, and when
we do, we use a calculator. So rather than show you the mechanical way, we will develop a way to
convert mentally in our head. The mental conversion from binary to decimal relies on the fact that in the
binary number system, each “digit place” corresponds to a power of 2 in decimal, as we showed in
Section 12.2.2.

Consider the following binary number:

111000012

43
Other documents randomly have
different content
de façon à réaliser peu à peu l'enchaînement positif dont j'ai déjà
établi le principe.
Les mêmes motifs fondamentaux qui ont démontré, avec tant
d'évidence, au chapitre précédent, l'inévitable spontanéité générale
d'un état intellectuel pleinement théologique, n'auraient ici besoin
que d'être examinés avec plus de précision pour prouver, au moins
aussi clairement, que toujours et partout ce premier régime mental
de l'humanité a dû nécessairement commencer par un état complet,
plus ou moins prononcé mais ordinairement très durable, de pur
fétichisme, constamment caractérisé par l'essor libre et direct de
notre tendance primitive à concevoir tous les corps extérieurs
quelconques, naturels ou artificiels, comme animés d'une vie
essentiellement analogue à la nôtre, avec de simples différences
mutuelles d'intensité. Cette constitution originaire des spéculations
humaines serait sans doute difficile à méconnaître aujourd'hui, soit
qu'on l'examinât à priori du point de vue rationnel où nous place
l'ensemble de la théorie biologique de l'homme, soit en l'étudiant à
posteriori d'après tous les renseignemens exacts que l'on peut
combiner sur ce premier âge social: enfin, l'appréciation judicieuse
du développement individuel confirmerait évidemment, à cet égard,
l'analyse immédiate de l'évolution collective. Beaucoup de
philosophes sont néanmoins parvenus, d'après des méthodes vagues
et vicieuses, à obscurcir profondément des notions aussi
irrécusables, en s'efforçant d'établir, au contraire, que le point de
départ intellectuel a dû consister dans le polythéisme proprement
dit, c'est-à-dire dans la croyance spontanée à des êtres surnaturels,
distincts et indépendants de la matière, passivement soumise, pour
tous ses phénomènes, à leurs volontés suprêmes. Quelques-uns
même, qui, malgré leur prétendue résolution préalable de tout
examiner librement, subissaient, à leur insu, l'empire, si rarement
évitable, des opinions vulgairement consacrées, sont allés jusqu'à
intervertir entièrement la progression naturelle des idées
théologiques, en voulant représenter le monothéisme rigoureux
comme la véritable source primordiale, d'où seraient ensuite issus,
par corruption graduelle, le fétichisme après le polythéisme[2]. Il
serait certainement superflu de s'arrêter ici à discuter aucunement
ces diverses aberrations, si manifestement contraires, non-
seulement à l'ensemble des observations les plus décisives sur
l'homme et sur la société, mais encore à toutes les lois les mieux
établies sur la marche nécessairement toujours graduelle de notre
intelligence, jusque dans ses plus simples exercices. A tous égards,
notre vrai point de départ, intellectuel ou moral, est inévitablement
beaucoup plus humble que ne l'indiquent ces fantastiques
suppositions: l'homme a partout commencé par le fétichisme le plus
grossier, comme par l'anthropophagie la mieux caractérisée; malgré
l'horreur et le dégoût que nous éprouvons justement aujourd'hui au
seul souvenir d'une semblable origine, notre principal orgueil collectif
doit consister précisément, non à méconnaître vainement un tel
début, mais à nous glorifier de l'admirable évolution dans laquelle la
supériorité, graduellement développée, de notre organisation
spéciale, nous a enfin tant élevés au-dessus de cette misérable
situation primitive, où aurait sans doute indéfiniment végété toute
espèce moins heureusement douée.
Note 2: Une telle hypothèse ne saurait être vraiment
soutenable que pour ceux qui admettent, à cet égard, une
révélation directe et spéciale, suivant l'esprit du système
catholique. Encore faudrait-il, même alors, concevoir cette
révélation comme presque continue, ou du moins fréquemment
renouvelée, afin de combattre sans cesse le retour toujours
imminent à la marche vraiment naturelle: ainsi que le vérifie
clairement le cas des Hébreux, malgré leur divin enseignement,
fortifié des précautions les plus puissantes et les mieux
soutenues, incapables néanmoins, en tant d'occasions, d'y
contenir suffisamment l'instinct spontané vers l'idolâtrie primitive.

D'autres philosophes, plus rapprochés, à ce sujet, du véritable


esprit scientifique, tout en admettant cette progression évidente et
nécessaire du fétichisme au polythéisme et ensuite au monothéisme,
sans laquelle la marche générale de l'humanité serait
essentiellement inintelligible, sont tombés, à leur tour, dans une
erreur inverse de la précédente, et qui, beaucoup moins grave,
mérite cependant d'être ici sommairement signalée, afin de prévenir,
autant que possible, toute déviation quelconque relativement à ce
terme primordial, dont l'altération rejaillirait naturellement sur tout le
reste de la série sociale. Cette erreur secondaire consiste à regarder
le fétichisme comme n'ayant point strictement caractérisé le régime
mental primitif, en ce sens que ce premier état, quelque grossier
qu'il soit en effet, aurait été néanmoins toujours précédé lui-même
par une enfance encore plus imparfaite, où l'homme, exclusivement
occupé d'une conservation trop entravée, ne présenterait qu'une
existence toute matérielle, sans aucun souci d'opinions spéculatives
quelconques, réduites même au degré le plus élémentaire et le plus
spontané: tels seraient, par exemple, encore aujourd'hui, les
malheureux habitans de la Terre de Feu, de diverses parties de
l'Océanie, de quelques parties de la côte nord-ouest d'Amérique, etc.
Une semblable hypothèse n'altérerait point essentiellement, à la
manière des précédentes, notre progression fondamentale; elle
n'aurait évidemment d'autre effet que d'y superposer un terme
préliminaire, dont la considération propre pourrait être presque
toujours écartée dans l'usage ultérieur de la série sociale. Mais la
rectification de cette illusion, d'ailleurs aisément explicable, n'en
offre pas moins, sous un autre aspect philosophique, une véritable
importance, afin de maintenir scrupuleusement l'unité et
l'invariabilité nécessaires de la constitution fondamentale de
l'homme, si indispensable, comme je l'ai montré, au système
rationnel de la sociologie positive. On voit, en effet, que, d'après
cette hypothèse, les besoins purement intellectuels n'auraient pas
toujours existé, sous une forme quelconque, dans l'humanité, et qu'il
faudrait y admettre une époque où ils auraient absolument pris
naissance, sans aucune autre manifestation antérieure: ce qui serait
directement contraire à ce grand principe, fourni à la sociologie par
la biologie, que, toujours et partout, l'organisme humain a dû
présenter, à tous égards, les mêmes besoins essentiels, qui n'ont pu
successivement différer, en aucun cas, que par leur degré de
développement et leur mode correspondant de satisfaction. Une telle
position de la question suffit certainement pour la résoudre, et
montre aussitôt que cette opinion doit nécessairement résulter d'une
fausse appréciation des faits. Dans l'état même d'idiotisme et de
démence, où l'homme paraît rabaissé au-dessous d'un grand nombre
d'animaux supérieurs, on pourrait encore constater, avec les
précautions convenables, l'existence d'un certain degré d'activité
purement spéculative, qui se satisfait alors par un fétichisme très
grossier. Combien serait-il donc irrationnel, à plus forte raison, de
penser que, à aucun âge de l'enfance sociale, l'homme normal, et
doué, au moins implicitement, de toutes ses facultés, ait pu jamais
être livré, d'une manière rigoureusement exclusive, à une vie
purement matérielle de guerre ou de chasse, sans aucune
manifestation quelconque des besoins intellectuels, quelque
oppressive qu'on veuille alors supposer la puissance d'un milieu
défavorable. En principe, cette hypothèse serait évidemment
insoutenable. Mais je puis d'ailleurs facilement indiquer la source
très naturelle d'une pareille illusion, que me semblent partager
encore presque tous les observateurs, même les plus judicieux et les
plus sagaces, qui ont étudié, par une exploration directe, les
premiers degrés de la vie sauvage; ce qui doit faire mieux ressortir
l'utilité de cette rectification. Il suffit de remarquer, à cet effet, que,
dans ces différens cas, l'absence réelle d'idées théologiques
quelconques a été essentiellement conclue, non d'une conférence
directe, qui n'eût pu même être convenablement établie, mais du
seul défaut de tout culte organisé, à sacerdoce plus ou moins
distinct. Or, comme je l'expliquerai ci-après, le fétichisme, de sa
nature, peut se développer beaucoup avant de donner lieu à aucun
véritable sacerdoce, jusqu'à ce qu'il ait atteint à l'état d'astrolâtrie,
ce qui arrive souvent fort tard, et tout près de sa transformation
finale en polythéisme proprement dit. Telle est la simple origine de
cette illusion, qui, malgré sa gravité, est, au fond, très excusable,
chez des explorateurs qui ne pouvaient être dirigés par aucune
théorie positive, propre à prévenir ou à réparer toute vicieuse
interprétation des faits.
On a dit, il est vrai, à l'appui d'une telle hypothèse, que l'homme
a dû essentiellement commencer à la manière des animaux. Je
l'admets en effet, sauf la supériorité d'organisation, mais en niant
l'induction qu'on en veut tirer, et qui repose, à mes yeux, sur une
fausse appréciation de l'état mental des animaux eux-mêmes. Car je
suis convaincu que les animaux assez élevés pour manifester, en cas
de loisir suffisant, une certaine activité spéculative (et beaucoup
d'espèces en sont assurément susceptibles), parviennent
spontanément, de la même manière que nous, à une sorte de
fétichisme grossier, consistant toujours à supposer les corps
extérieurs, même les plus inertes, animés de passions et de volontés
plus ou moins analogues aux impressions personnelles du
spectateur. Une judicieuse exploration de l'intelligence des animaux
ne laisse aucun doute sur la réalité de cette similitude essentielle,
sauf la différence fondamentale que présente l'incontestable aptitude
de l'entendement humain à se dégager graduellement de ces
ténèbres primitives, qui, pour les autres organismes, même les plus
éminens, doivent, au contraire, indéfiniment persister; excepté peut-
être, chez quelques animaux choisis, un faible commencement de
polythéisme, qu'il faudrait d'ailleurs attribuer surtout au contact
humain. Que, par exemple, un enfant ou un sauvage, d'une part, et,
d'une autre part, un chien ou un singe, contemplent une montre
pour la première fois: il n'y aura, sans doute, si ce n'est quant à la
manière de formuler, aucune profonde diversité immédiate dans la
conception spontanée qui, aux uns et aux autres, représentera cet
admirable produit de l'industrie humaine comme une sorte d'animal
véritable, ayant ses goûts et ses inclinations propres: d'où résulte,
par conséquent, sous ce rapport, un fétichisme radicalement
commun, les premiers ayant seulement le privilége exclusif d'en
pouvoir ultérieurement sortir. Ainsi, l'appréciation rationnelle du
véritable degré de similitude nécessaire entre le développement
mental de l'homme et celui des autres animaux supérieurs, d'après
la similitude correspondante de leurs organismes cérébraux,
n'aboutit réellement qu'à confirmer de nouveau, bien loin de l'altérer,
notre proposition générale sur le vrai point de départ intellectuel de
l'humanité.
Exclusivement habitués dès long-temps à une théologie
éminemment métaphysique, nous devons éprouver aujourd'hui
beaucoup d'embarras à comprendre réellement cette grossière
origine, qui a dû fréquemment donner lieu à de graves méprises
involontaires. C'est ainsi surtout que le fétichisme a même été le
plus souvent confondu avec le polythéisme, lorsqu'on a indûment
appliqué à celui-ci la dénomination usuelle d'idolâtrie, qui ne
convient certainement qu'au premier; puisque les prêtres de Jupiter
ou de Minerve auraient pu sans doute aussi légitimement repousser
le reproche banal d'adoration des images que le font aujourd'hui nos
docteurs catholiques quant à l'injuste accusation des protestans.
Mais, quoique nous soyons heureusement assez éloignés du
fétichisme pour ne plus le concevoir aisément, chacun de nous n'a
qu'à remonter suffisamment dans sa propre histoire individuelle,
pour y retrouver la fidèle représentation d'un tel état initial. Tous les
philosophes qui sauront aujourd'hui se dégager convenablement des
opinions vulgaires, sentiront aussitôt que le fétichisme constitue
nécessairement le vrai fond primordial de l'esprit théologique,
envisagé dans sa plus pure naïveté élémentaire, et néanmoins dans
sa plus entière plénitude intellectuelle: c'est là que conviendrait
éminemment la célèbre formule de Bossuet: Tout était dieu, excepté
Dieu même, pourvu qu'on l'appliquât à un point de départ, et non à
une chimérique dégénération; car on peut strictement dire, en effet,
que, depuis cette première époque, le nombre des dieux a été sans
cesse en décroissant, comme je l'expliquerai bientôt. Lorsque, même
aujourd'hui, les plus éminens penseurs se laissent involontairement
entraîner, sous l'influence imparfaitement rectifiée de notre vicieuse
éducation, à tenter de pénétrer le mystère de la production
essentielle de phénomènes quelconques, simples ou compliqués,
dont ils ignorent les lois naturelles, ils peuvent alors personnellement
constater cette invariable tendance instinctive à concevoir la
génération des effets inconnus d'après les passions et les affections
de l'être correspondant, toujours envisagé comme vivant, ce qui
n'est réellement autre chose que le principe philosophique du
fétichisme proprement dit. Ceux qui, par exemple, auront souri avec
le plus de dédain à la naïveté du sauvage animant spontanément la
montre dont il admire le jeu, pourraient, à leur tour, se surprendre
eux-mêmes plus d'une fois dans une disposition mentale bien peu
supérieure, malgré leur habitude d'un tel spectacle, quand ils
contemplent, entièrement étrangers à l'horlogerie, les accidens
imprévus, et souvent inexplicables, dus à quelque dérangement
inaperçu de cet ingénieux appareil. Il nous serait, sans doute, très
difficile de contenir alors suffisamment la disposition naturelle qui
nous entraîne à regarder ces altérations comme autant d'indices des
affections ou des caprices d'un être chimérique, si la puissance,
enfin prépondérante, d'une analogie antérieure déjà fort étendue, ne
nous conduisait maintenant à calmer notre inquiétude intellectuelle
par l'immédiate supposition générale d'une certaine lésion
mécanique, ultérieurement assignable, comme en beaucoup d'autres
cas semblables préalablement analysés à notre entière satisfaction.
Ainsi, la philosophie théologique, convenablement approfondie, a
toujours évidemment pour base nécessaire le pur fétichisme, qui
divinise instantanément chaque corps ou chaque phénomène
susceptibles d'attirer avec quelque énergie la faible attention de
l'humanité naissante. Quelques transformations essentielles que
cette philosophie primitive puisse ensuite subir graduellement, une
judicieuse analyse sociologique y pourra toujours mettre à nu ce
fond primordial, jamais entièrement dissimulé, même dans l'état
religieux le plus éloigné du point de départ. Non-seulement, par
exemple, la théocratie égyptienne, dont celle des Juifs fut
certainement une simple dérivation, a dû présenter, aux temps de sa
plus grande splendeur, la co-existence régulière et très prolongée,
dans les différentes castes de sa hiérarchie sacerdotale, de nos trois
âges religieux, puisque les rangs inférieurs étaient encore restés au
simple fétichisme, tandis que les premiers rangs étaient en pleine
possession d'un polythéisme très caractérisé, et que les degrés
suprêmes s'étaient même déjà élevés très probablement à une
certaine ébauche du monothéisme; mais, en scrutant plus
profondément l'esprit théologique, on peut, en outre, y reconnaître,
en tout temps, par une analyse plus directe et plus décisive, des
traces actuelles très prononcées du fétichisme fondamental, malgré
les formes les plus métaphysiques qu'il ait pu affecter chez les plus
subtiles intelligences. Qu'est-ce, en effet, au fond, que cette célèbre
conception de l'âme du monde chez les anciens, ou cette
assimilation plus moderne de la terre à un immense animal vivant, et
tant d'autres doctrines analogues, sinon un véritable fétichisme,
vainement déguisé sous un pompeux verbiage philosophique? Il n'y
a là, sans doute, comparativement au fétichisme spontané des
temps primitifs, d'autre différence essentielle que de se rapporter à
des êtres collectifs et abstraits au lieu d'êtres purement individuels et
concrets. De nos jours même, qu'est-ce réellement, pour un esprit
positif, que ce ténébreux panthéisme dont se glorifient si
étrangement, surtout en Allemagne, tant de profonds
métaphysiciens, sinon le fétichisme généralisé et systématisé,
enveloppé d'un appareil doctoral propre à donner le change au
vulgaire? Par d'aussi décisives confirmations d'un principe déjà
directement établi, il devient donc irrécusable que le pur fétichisme,
loin de constituer une simple aberration de l'esprit théologique, en
indique nécessairement la source fondamentale, et détermine son
vrai caractère primordial, jusqu'aux temps beaucoup plus récens où,
comme je l'expliquerai bientôt, son mélange de plus en plus intime
avec l'esprit métaphysique proprement dit en altère profondément la
nature originelle, néanmoins toujours reconnaissable à une saine
exploration scientifique. Telle est donc notre théologie vraiment
primitive, celle qui présente le plus complétement cette rigoureuse
spontanéité, où réside, d'après le chapitre précédent, le privilége
essentiel de toute philosophie théologique, et qu'aucun autre âge
religieux n'a pu certainement offrir à un degré aussi parfaitement
approprié à la torpeur initiale de l'entendement humain, alors ainsi
dispensé même de créer la fiction facile des divers agens
surnaturels, et se bornant à céder presque passivement à la pente
naturelle qui nous entraîne à transporter au dehors ce sentiment
d'existence dont nous sommes intérieurement pénétrés, lequel, nous
semblant d'abord expliquer suffisamment nos propres phénomènes,
nous sert immédiatement de base uniforme à l'interprétation absolue
de tous les phénomènes extérieurs. Cette première philosophie a dû
rester, comme toute autre, bornée d'abord au monde inanimé,
considéré dans tous ses phénomènes de quelque importance, et
sans excepter même les phénomènes purement négatifs, par
exemple ceux des ombres, qui ont sans doute long-temps produit
sur l'humanité naissante la même impression fondamentale de
terreur superstitieuse qu'ils déterminent encore si souvent dans
notre enfance individuelle, comme chez tant d'animaux. Mais cette
théologie spontanée n'a pas dû tarder à être pareillement étendue à
l'étude de l'animalité, jusqu'à produire fréquemment l'adoration[3]
formelle des animaux, quand ils offraient à l'homme, sous un aspect
quelconque, un spectacle plus ou moins mystérieux, c'est-à-dire dont
il ne retrouvait pas en lui l'équivalent essentiel, soit que l'exquise
supériorité de l'odorat, ou de tout autre sens, leur procurât
immédiatement des notions dont l'origine, en beaucoup de cas, nous
échappe encore aujourd'hui, soit qu'une plus grande susceptibilité
organique leur fît, à certains égards, sentir avant nous diverses
variations principales de l'atmosphère, etc.
Note 3: Ce genre d'idolâtrie a dû toutefois être bien moins
commun qu'on ne l'a cru, parce qu'on a souvent confondu sans
doute, avec une véritable adoration directe, le respect spécial
pour des animaux consacrés à quelque divinité extérieure, suivant
un usage long-temps pratiqué chez les Grecs et même chez les
Romains, indépendamment d'ailleurs de certains animaux
habituellement entretenus comme instrumens de divination.

Une telle manière de philosopher n'est pas moins parfaitement


adaptée, par sa nature, au vrai caractère moral de l'humanité
naissante qu'à sa première situation mentale. Nous avons reconnu,
au chapitre précédent, que le sens général de l'évolution humaine
consiste surtout à diminuer de plus en plus l'inévitable
prépondérance, nécessairement toujours fondamentale, mais
d'abord excessive, de la vie affective sur la vie intellectuelle, ou,
suivant la formule anatomique, de la région postérieure du cerveau
sur la région frontale; d'une manière d'ailleurs essentiellement
commune au développement de l'espèce et à celui de l'individu. Or,
cet empire, évidemment plus prononcé à l'origine, des passions sur
la raison, et qui doit alors, comme je l'ai montré, nous disposer
spécialement à la philosophie théologique, est certainement plus
favorable encore à la théologie fétichiste qu'à aucune autre. Tous les
corps observables étant ainsi immédiatement personnifiés, et doués
de passions ordinairement très puissantes, selon l'énergie de leurs
phénomènes, le monde extérieur se présente spontanément, envers
le spectateur, dans une parfaite harmonie, qui n'a pu jamais se
retrouver ensuite au même degré, et qui doit produire en lui un
sentiment spécial de pleine satisfaction, que nous ne pouvons guère
qualifier aujourd'hui convenablement, faute de pouvoir suffisamment
l'éprouver, même en nous reportant, par la méditation la plus
intense et la mieux dirigée, à ce berceau de l'humanité. On conçoit
aisément combien cette exacte correspondance intime entre le
monde et l'homme doit nous attacher profondément au fétichisme,
qui réciproquement tend aussi, de toute nécessité, à prolonger
spécialement un tel état moral. Cette co-relation spontanée peut
encore se vérifier, même quand l'évolution humaine est la plus
avancée, en considérant les organisations ou les situations, dès lors
plus ou moins exceptionnelles, où la vie affective acquiert, à un titre
quelconque, une prédominance très rapprochée de l'irrésistibilité.
Malgré la plus grande culture intellectuelle, les hommes qui, pour
ainsi dire, pensent naturellement par le derrière de la tête, ou ceux
qui se trouvent momentanément dans une disposition semblable
(dont personne peut-être, même parmi les meilleurs esprits, n'a
jamais été entièrement préservé), ont besoin d'exercer presque
incessamment sur leurs propres pensées une très active surveillance,
pour ne pas se laisser essentiellement entraîner, dans l'état très
prononcé de crainte ou d'espérance déterminé par une passion
quelconque, à une sorte de rechute aiguë vers le fétichisme
fondamental, en personnifiant, et ensuite divinisant, jusqu'aux objets
les plus inertes qui peuvent intéresser leurs affections actuelles. Ces
tendances partielles ou passagères peuvent nous suggérer
aujourd'hui une faible idée de la puissance primordiale d'un tel état
moral, lorsque, à la fois complet et normal, il était d'ailleurs
permanent et commun. La constitution, encore si métaphorique, du
langage humain, dans les idiomes même les plus perfectionnés, en
offre aussi, à mes yeux, un témoignage universel et prolongé,
irrécusable quoique indirect. On ne saurait douter, en effet, que la
formation du fond essentiel de ce langage ne remonte, en grande
partie, jusqu'à cet âge du fétichisme proprement dit, qui a dû
persister plus long-temps qu'aucun autre peut-être, par la lenteur
plus spéciale des progrès qu'il comportait, comme je vais l'expliquer.
En second lieu, l'opinion ordinaire, qui attribue surtout le fréquent
usage des expressions figurées à la seule disette de signes directs,
est sans doute trop rationnelle pour devenir suffisamment
admissible, autrement qu'envers une époque très avancée de
l'évolution intellectuelle. Jusque alors, et précisément pendant les
temps qui ont dû le plus influer sur la formation ou plutôt le
développement de la langue humaine[4], l'excessive surabondance
des figures a dû tenir bien davantage au régime philosophique alors
dominant, qui, surtout à l'état de fétichisme, assimilant directement
tous les phénomènes possibles aux actes humains, devait faire
introduire, comme essentiellement fidèles, des expressions qui ne
peuvent plus nous sembler que métaphoriques, depuis que nous
avons complétement dépassé l'état mental qui en motivait le sens
littéral. Cet aperçu scientifique serait, au besoin, suffisamment
confirmé par une remarque intéressante, déjà faite depuis long-
temps, sur le décroissement graduel d'une telle tendance à mesure
que l'esprit humain se développe: ce qui, toutefois, n'en rendrait
point superflue l'ultérieure vérification spéciale, d'après un ensemble
suffisant d'analyses philologiques convenablement instituées. Pour
faciliter la conception d'un tel travail, je me bornerai à ajouter ici une
indication caractéristique, relative aux temps modernes, où la nature
des métaphores se transforme insensiblement de plus en plus, en ce
que, au lieu de transporter, comme dans l'état primitif, au monde
extérieur les expressions propres aux actes humains, la révolution
fondamentale qui s'accomplit graduellement dans notre manière de
philosopher nous conduit, au contraire, à appliquer toujours
davantage aux divers phénomènes de la vie des termes
primitivement destinés à la nature inerte, dont la considération
prépondérante constitue, comme je l'ai tant établi, la base
nécessaire du véritable esprit scientifique, qui exercera désormais
sur la constitution du langage humain une influence de plus en plus
profonde.
Note 4: J'emploie ici à dessein le singulier, afin d'indiquer ma
conviction bien arrêtée sur l'unité fondamentale du langage
humain, quoique la nature et la destination de cet ouvrage ne me
permettent pas d'y examiner, même sommairement, cet important
sujet. Dans le Traité spécial que j'ai annoncé, je pourrai
ultérieurement justifier ce lumineux principe, qui peut seul
conduire à constituer, en temps opportun, une vraie philosophie
du langage, et que l'esprit positif doit envisager, ce me semble,
comme l'une des grandes données préalables fournies à la
sociologie par la biologie. Car chaque espèce d'animaux
supérieurs étant toujours douée, en vertu de son organisation,
d'un certain langage propre, dont l'identité nécessaire se fait
partout sentir à travers les diverses modifications quelconques,
souvent très notables, de climat et même de race, une vaine et
fallacieuse métaphysique me paraît seule pouvoir conduire à
concevoir irrationnellement notre espèce comme arbitrairement
soustraite à cette loi universelle du règne animal, sans que rien,
dans notre organisme, pût certes motiver cette étrange anomalie.
Quand les hautes recherches philologiques, qui, du reste,
commencent déjà spontanément à converger avec évidence vers
une telle tendance, pourront être enfin convenablement
instituées, par l'indispensable concours permanent d'une plus
saine éducation préliminaire avec l'usage régulier d'une théorie
sociologique vraiment directrice, je ne doute pas qu'elles ne
fassent alors de rapides progrès dans la manifestation irrécusable
des vrais élémens fondamentaux de la langue humaine.

Après avoir ainsi directement établi, sous le point de vue général


propre à cet ouvrage, l'inévitable nécessité de ce premier âge
théologique, et suffisamment expliqué son vrai caractère
fondamental, il nous reste à apprécier sommairement son influence
propre sur l'ensemble de l'évolution humaine, et ensuite, plus
spécialement, la transformation graduelle qui en fait spontanément
dériver le second âge naturel de la philosophie théologique.
Lorsque, sans s'arrêter aux premières impressions, on compare,
d'une manière convenablement approfondie, toutes les grandes
phases religieuses de l'humanité, il n'est plus douteux, comme je l'ai
ci-dessus indiqué, que le fétichisme ne constitue réellement, du
moins quant à l'existence individuelle, l'état théologique le plus
intense, c'est-à-dire celui où cet ordre d'idées exerce la plus vaste et
la plus intime prépondérance dans tout notre système mental.
Quelque monstrueux que nous semble aujourd'hui, chez les auteurs
anciens, l'inépuisable dénombrement des divinités du paganisme,
nous trouverions un résultat bien plus étrange encore s'il était
possible d'exécuter suffisamment une telle revue envers les dieux
des purs fétichistes, ainsi que j'aurai lieu ci-après d'en signaler le
principal motif. Cette multiplicité supérieure devait, en effet, résulter
du caractère essentiellement individuel et concret des croyances
fétichiques, où chaque corps observable devient spontanément le
sujet propre d'une superstition distincte. Mais indépendamment
d'une telle complication numérique, cette liaison immédiate et
continue doit alors donner une bien plus grande influence mentale
aux conceptions théologiques, à travers lesquelles, pour ainsi dire,
s'effectuent nécessairement toutes les observations; sauf quelques
rares notions pratiques sur les divers ordres de phénomènes
naturels, inévitablement fournies par l'expérience involontaire, et
qui, dans l'origine, sont peu supérieures aux connaissances réelles
que les plus éminens animaux acquièrent d'une manière analogue. A
aucun autre âge religieux, les idées théologiques n'ont certainement
pu être aussi directement ni aussi complétement adhérentes aux
sensations elles-mêmes, qui alors les rappelaient presque sans délai
et sans discontinuité; en sorte qu'il devait être presque impossible à
l'intelligence d'en faire essentiellement abstraction, même d'une
manière partielle et momentanée. L'immense progrès qui nous
sépare heureusement de cette première enfance, doit en rendre
maintenant très difficile l'exacte appréciation, outre l'embarras
croissant des explorations directes de plus en plus rares. Mais, en se
plaçant au point de vue convenable[5], je ne doute pas que la
plupart des juges compétens ne reconnaissent enfin la justesse de
cette importante observation sur la prépondérance intellectuelle de
l'esprit théologique, beaucoup plus prononcée au temps du
fétichisme que sous aucun autre régime religieux: ce qui tend à
confirmer, dès le point de départ, ma proposition générale sur le
décroissement continu d'un tel esprit à mesure que l'évolution
intellectuelle s'accomplit, suivant ma théorie fondamentale du
développement humain. Toutefois, la confusion trop ordinaire où
tombent presque tous les philosophes entre l'empire mental des
croyances religieuses et leur influence sociale, empêche
essentiellement, à cet égard, toute saine appréciation générale,
parce que ce n'est point alors en effet que la philosophie théologique
a pu obtenir son plus grand, et surtout son plus heureux ascendant
politique, dont le développement propre a dû être plutôt en sens
inverse, par une remarquable coïncidence, que la suite de notre
opération historique expliquera spontanément. Afin de dissiper ici, à
ce sujet, toute incertitude essentielle, il faut donc maintenant
caractériser le motif principal de la moindre puissance du fétichisme
comme moyen de civilisation, malgré son extension intellectuelle
certainement supérieure; d'où résultera ensuite aisément la
détermination sommaire de sa véritable influence sociale.
Note 5: C'est uniquement au très petit nombre d'esprits
pleinement philosophiques qui ont pu essentiellement accomplir
déjà la grande évolution mentale, qu'il appartient aujourd'hui
d'entreprendre avec succès de telles comparaisons, à cause de
l'heureuse faculté que leur procure exclusivement une entière
émancipation personnelle, de transporter presque indifféremment
leurs pensées à tous les degrés de l'échelle théologique, sans
aucune prédilection perturbatrice. J'aurai plus d'une occasion
naturelle de faire nettement sentir, dans les deux chapitres
suivans, que ce n'est point des philosophes religieux qu'on doit
finalement attendre une histoire vraiment rationnelle de la
religion, conçue et exécutée d'une manière impartiale et
lumineuse. A la vérité, l'esprit de dénigrement systématique qui
caractérisait, à cet égard, les encyclopédistes du siècle dernier,
devait certainement les rendre encore moins propres à cette
haute appréciation philosophique. Elle ne saurait convenir qu'à
des intelligences aussi pleinement affranchies des préventions
métaphysiques que des préjugés théologiques, et pour lesquelles
ces deux ordres d'idées antagonistes soient désormais
pareillement ensevelis dans un irrévocable passé, où la part
nécessaire de chacun d'eux devient exactement assignable,
d'après la vraie théorie générale du développement humain.

On doit, à cet effet, remarquer d'abord que, malgré les


récriminations modernes contre l'autorité sacerdotale, une telle
autorité est néanmoins strictement indispensable pour utiliser
réellement la propriété civilisatrice de la philosophie théologique.
Non-seulement toute doctrine quelconque exige évidemment des
organes spéciaux, qui puissent toujours en diriger et en surveiller
l'application sociale. Mais, en outre, les croyances religieuses sont,
par leur nature, beaucoup plus complétement assujéties que toutes
les autres à cette nécessité commune, à cause du vague indéfini qui
les caractérise spontanément, et qui ne peut être suffisamment
contenu que par l'exercice permanent d'une très active discipline,
convenablement organisée. Sans cette indispensable condition, les
idées théologiques peuvent avoir beaucoup d'extension et d'énergie,
au point même d'occuper presque exclusivement l'intelligence, et ne
comporter néanmoins qu'une très faible consistance politique, en
suscitant plutôt des divergences que des convergences: comme nous
le confirme éminemment la grande expérience des trois derniers
siècles, où, par la désorganisation générale de l'ancienne autorité
théologique, les croyances religieuses sont devenues bien plus un
puissant principe de discorde qu'un véritable lien social,
contrairement à leur destination essentielle, que l'étymologie semble
aujourd'hui rappeler avec une sorte d'ironie. Or, en ayant
convenablement égard à cette considération fondamentale, il est
facile d'expliquer la moindre influence sociale de la philosophie
théologique à l'époque du fétichisme, malgré qu'elle occupât
certainement alors beaucoup plus de place dans l'ensemble de
l'entendement humain.
Cette coïncidence nécessaire tient, en effet, à ce que le
fétichisme comportait infiniment moins que le polythéisme et le
monothéisme le développement propre d'une autorité sacerdotale
distinctement organisée en classe spéciale, par une suite nécessaire
du caractère essentiel des croyances correspondantes. Presque tous
les dieux du fétichisme sont éminemment individuels, et chacun
d'eux a sa résidence inévitable et permanente dans un objet
particulièrement déterminé; tandis que ceux du polythéisme ont, de
leur nature, une bien plus grande généralité, un département
beaucoup plus étendu quoique toujours propre, et enfin un siége
infiniment moins circonscrit. Cette différence fondamentale constitue
sans doute, pour le fétichisme, une aptitude plus prononcée à
correspondre spontanément, avec une exacte harmonie, à l'état
primitif de l'esprit humain, où toutes les idées sont nécessairement,
au plus haut degré, particulières et concrètes; et de là résulte,
comme je l'ai ci-dessus noté, la multiplicité très supérieure des
divinités de cette première enfance. Mais, sous le point de vue
social, il est pareillement évident que de telles croyances offrent, par
leur nature, beaucoup moins de ressources, soit pour réunir les
hommes, soit pour les gouverner. Quoiqu'il existe, sans doute, des
fétiches de tribu, et même de nation, la plupart néanmoins sont
essentiellement domestiques, ou même personnels, ce qui offre bien
peu de secours au développement spontané de pensées
suffisamment communes. En second lieu, le siége immédiat de
chaque divinité dans un objet matériel nettement déterminé, doit
rendre le sacerdoce proprement dit presque inutile, et, par suite,
tend à empêcher directement l'essor d'une classe spéculative,
vraiment distincte et influente. Ce n'est pas que le culte ne soit alors
fort étendu, car il tient, au contraire, bien plus de place, qu'à aucune
époque théologique plus avancée, dans l'ensemble de la vie
humaine, qui en est plus intimement pénétrée, chaque acte
particulier de l'homme ayant pour ainsi dire son propre aspect
religieux. Mais c'est presque toujours un culte essentiellement
personnel et direct, dont chaque croyant peut être le ministre
immédiat, sans aucune interposition forcée envers ses divinités
spéciales, constamment accessibles par leur nature. C'est surtout la
croyance ultérieure à des dieux habituellement invisibles, plus ou
moins généraux, et essentiellement distincts des corps soumis à leur
arbitraire discipline, qui a dû déterminer, à l'âge du polythéisme, le
développement rapide et prononcé d'un vrai sacerdoce, susceptible
d'une haute prépondérance sociale, comme constituant, d'une
manière régulière et permanente, un intermédiaire indispensable
entre l'adorateur et sa divinité. Le fétichisme, au contraire, n'exigeait
point évidemment cette inévitable intervention, et tendait ainsi à
prolonger extrêmement l'enfance de l'organisation sociale, dont le
premier essor, comme je l'ai établi au chapitre précédent, devait
certainement dépendre de la formation distincte d'une classe
spéculative, c'est-à-dire alors sacerdotale. Dans l'analyse, beaucoup
mieux connue, des âges théologiques ultérieurs, on peut observer
encore des traces très marquées de ce caractère nécessaire des
cultes primitifs, aux temps même de la plus entière extension
intellectuelle et sociale du polythéisme grec ou romain, en
considérant le mode spécial, très précieux à remarquer sous ce
rapport, qui y distinguait l'adoration des dieux lares et pénates,
divinités essentiellement domestiques, où l'on doit, à mon gré,
reconnaître de purs fétiches, dont le culte, particulièrement modifié
chez les diverses familles, s'y célébrait toujours directement, sans
intervention sacerdotale, chaque fidèle, ou du moins chaque chef de
famille, étant resté, à cet égard, une sorte de prêtre spontané.
Toutefois, l'observation plus complète et plus variée des
populations fétichistes semble indiquer que ce premier âge religieux
n'est point entièrement incompatible avec la formation ébauchée
d'une certaine classe sacerdotale, commençant à se détacher assez
distinctement de la masse sociale, comme l'indiquent divers cas
relatifs à des professions spéciales de devins, de jongleurs, etc., chez
plusieurs peuplades nègres, qui ne sont point cependant sorties
entièrement du vrai fétichisme. Mais, par un examen plus approfondi
de ces degrés de l'échelle sociale, soit dans l'antiquité, soit de nos
jours, on reconnaîtra toujours, ce me semble, que le fétichisme est
alors essentiellement parvenu à l'état d'astrolâtrie, qui constitue son
plus haut perfectionnement propre, et sous lequel s'effectue, comme
je l'expliquerai bientôt, sa transition générale au polythéisme
proprement dit. Or, cette phase plus éminente, mais aussi beaucoup
plus tardive, du fétichisme fondamental, tend, en effet, par sa nature
spéciale, à provoquer directement le développement distinct d'un
vrai sacerdoce. D'abord, la considération des astres porte en elle-
même un caractère d'évidente généralité, qui les rend
immédiatement aptes à devenir des fétiches vraiment communs; et
c'est toujours aussi de cette source exclusive que l'analyse
sociologique nous les montre essentiellement tirés chez des
populations un peu étendues. En second lieu, quand leur situation
pleinement inaccessible a été suffisamment reconnue, ce qui a dû
être beaucoup moins immédiat qu'on ne le croit d'ordinaire, le
besoin d'intermédiaires spéciaux a dû se faire sentir, à leur égard,
d'une manière irrécusable. Tels sont les deux caractères essentiels,
généralité supérieure, et accès plus difficile, qui, sans altérer
directement la nature fondamentale du fétichisme universel, ont dû y
rendre l'adoration des astres particulièrement propre à déterminer la
formation d'un culte vraiment organisé et d'un sacerdoce pleinement
distinct, sans lesquels le développement politique serait demeuré
essentiellement impossible. On conçoit ainsi combien sont
radicalement vicieuses les tendances vagues et absolues de la
philosophie politique actuelle, qui nous font, par exemple,
condamner aveuglément le culte des astres comme un principe
universel de dégradation humaine; tandis que l'avènement de
l'astrolâtrie constitue réellement, au contraire, non-seulement un
symptôme essentiel, mais aussi un puissant moyen, de progrès
social, pour les temps correspondans, quoique sa prolongation
démesurée ait dû ultérieurement devenir une source d'entraves.
Mais il a dû s'écouler un temps fort considérable avant que
l'adoration des astres ait pu prendre un ascendant prononcé sur les
autres branches du fétichisme, de manière à imprimer à l'ensemble
du culte les caractères essentiels d'une véritable astrolâtrie. Car,
l'esprit humain, d'abord préoccupé des considérations les plus
directes et les plus particulières, ne pouvait alors nullement placer
les corps célestes au premier rang des substances extérieures. Ils
ont dû long-temps avoir pour lui beaucoup moins d'importance qu'un
grand nombre de phénomènes terrestres; tels, par exemple, que les
principaux effets météorologiques, qui, à un âge bien plus avancé, et
pendant presque tout le règne théologique, ont essentiellement
fourni les attributs caractéristiques du suprême pouvoir surnaturel.
Tandis qu'on reconnaissait alors si généralement à tous les
magiciens habiles une autorité fort étendue sur la lune et les étoiles,
personne n'aurait osé leur supposer aucune participation quelconque
au gouvernement du tonnerre. Il a donc fallu préalablement une
suite très prolongée de modifications graduelles dans les conceptions
humaines, pour intervertir en quelque sorte l'ordre primordial, en
plaçant enfin les astres à la tête des corps naturels, quoique toujours
nécessairement subordonnés à la terre et à l'homme, suivant l'esprit
fondamental de la philosophie théologique, parvenue même à son
plus haut perfectionnement total. Or, c'est seulement quand le
fétichisme s'est ainsi élevé enfin à l'état d'astrolâtrie, qu'il a pu
exercer, d'une manière permanente et régulière, une influence
politique vraiment capitale, par le double motif ci-dessus indiqué.
Telle est donc, désormais, en général, l'explication rationnelle de ce
singulier caractère, source inextricable de confusion dans les
jugemens ordinaires sur ces degrés inférieurs de l'échelle sociale, qui
fait alors coïncider essentiellement une plus grande extension
intellectuelle de l'esprit théologique avec une moindre influence
sociale. Ainsi, non-seulement le fétichisme, comme toute autre
philosophie quelconque, n'a pu s'étendre aux considérations morales
et sociales qu'après avoir d'abord suffisamment dirigé toutes les
spéculations moins compliquées: mais, en outre, des motifs spéciaux
très puissans ont dû, comme on le voit, retarder extrêmement
l'époque où il a pu acquérir une véritable consistance politique,
malgré son immense extension intellectuelle préalable.
En terminant cette appréciation sommaire, je ne puis
m'empêcher de signaler une importante réflexion qu'elle suggère
naturellement sur l'ensemble du règne théologique, et qui est déjà
très propre à rendre fort douteuse cette aptitude caractéristique à
servir indéfiniment de base aux liens sociaux, qu'on attribue encore
vulgairement aux croyances religieuses, à l'exclusion de tout autre
ordre quelconque de conceptions communes. Il résulte
spontanément, en effet, des considérations précédentes, que cette
propriété politique est bien loin de leur appartenir d'une manière
aussi intime et aussi absolue qu'on le suppose, puisqu'elle n'a pu se
développer librement au temps même de la plus grande extension
mentale du système religieux. Cette observation décisive ne fera que
se compléter davantage par la suite de notre opération historique,
en reconnaissant, dans le polythéisme, et surtout dans le
monothéisme, la co-relation évidente et nécessaire du décroissement
intellectuel de l'esprit théologique avec une plus parfaite réalisation
de sa faculté civilisatrice; ce qui confirmera naturellement de plus en
plus que cette grande destination sociale, tout comme l'efficacité
purement philosophique, ne pouvait lui être attribuée que
provisoirement, et jusqu'à l'avènement de principes à la fois plus
directs et plus stables, suivant la théorie fondamentale exposée à la
fin du volume précédent.
D'après l'ensemble de ces explications, ce sera donc surtout aux
deux leçons suivantes que nous devrons naturellement réserver la
juste appréciation générale des plus importans effets du système
théologique dans la grande évolution humaine. Mais, quoique le
fétichisme ait dû être ainsi nécessairement beaucoup moins propre,
si ce n'est dans sa dernière phase, au principal développement de la
politique théologique, son influence sociale n'en a pas moins été très
étendue, et même indispensable, comme nous allons maintenant
l'apprécier sommairement.
Sous le point de vue purement philosophique, où, en tant que
destinée à diriger alors le système général des spéculations
humaines, cette première forme de l'esprit religieux ne présente que
simplement au moindre degré possible la propriété fondamentale
que nous avons reconnue, en principe, rigoureusement inhérente à
toute philosophie théologique, de pouvoir seule ébranler la torpeur
initiale de notre intelligence, en fournissant spontanément à nos
conceptions un aliment et un lien quelconques. Mais, si le fétichisme
lui-même a certainement participé, sous ce rapport, à ce grand
caractère de la philosophie primitive, son action ultérieure, après la
production générale du premier éveil mental, a dû tendre
évidemment, avec beaucoup d'énergie, à empêcher l'essor des
connaissances réelles. Jamais, en effet, l'esprit religieux n'a pu être
aussi directement opposé que dans ce premier âge à tout véritable
esprit scientifique, à l'égard même des plus simples phénomènes.
Toute idée de lois naturelles invariables devrait alors paraître
éminemment chimérique, et serait d'ailleurs, si elle pouvait
distinctement surgir, aussitôt repoussée comme radicalement
contraire au mode consacré, qui rattache immédiatement
l'explication détaillée de chaque phénomène aux volontés arbitraires
du fétiche correspondant. L'esprit scientifique est sans doute bien
peu favorisé encore par le polythéisme, comme nous le
reconnaîtrons au chapitre suivant; mais il y est certainement
beaucoup moins comprimé que sous le fétichisme, quand on les
compare, à cet égard, d'une manière suffisamment approfondie.
Dans cette première enfance intellectuelle, que nous pouvons
maintenant si peu comprendre, les faits chimériques l'emportent
infiniment sur les faits réels; ou, plutôt, il n'y a, pour ainsi dire,
aucun phénomène qui puisse être alors nettement aperçu sous son
aspect véritable. Sous le fétichisme, et même pendant presque tout
le règne du polythéisme, l'esprit humain est nécessairement, envers
le monde extérieur, en un état habituel de vague préoccupation qui,
quoique alors normal et universel, n'en produit pas moins
l'équivalent effectif d'une sorte d'hallucination permanente et
commune, où, par l'empire exagéré de la vie affective sur la vie
intellectuelle, les plus absurdes croyances peuvent altérer
profondément l'observation directe de presque tous les phénomènes
naturels. Nous sommes aujourd'hui trop disposés à traiter
d'impostures des sensations exceptionnelles, que nous avons
heureusement cessé de pouvoir directement comprendre, et qui ont
été néanmoins, toujours et partout, très familières aux magiciens,
devins, sorciers, etc., de cette grande phase sociale. Mais, en
revenant, autant que possible, à l'image d'une telle enfance, où
l'absence totale des notions même les plus simples sur les lois de la
nature doit faire indifféremment admettre les plus chimériques récits
avec les plus communes observations, sans que rien pour ainsi dire
puisse alors sembler spécialement monstrueux, on pourra
reconnaître aisément la facilité trop réelle avec laquelle l'homme
voyait si souvent tout ce qu'il était disposé à voir, par des illusions
qui me semblent fort analogues à celles que le grossier fétichisme
des animaux paraît leur procurer très fréquemment. Quelque
familière que doive nous être aujourd'hui l'opinion fondamentale de
la constance des évènemens naturels, sur laquelle repose
nécessairement tout notre système mental, elle ne nous est
certainement point innée, puisqu'on peut presque assigner, dans
l'éducation individuelle, l'époque véritable de sa pleine
manifestation. La philosophie positive, qui exclut partout l'absolu, et
qui est, par sa nature, strictement assujétie à la condition, souvent
pénible, de tout comprendre afin de tout coordonner, doit, à cet
égard, disposer désormais les penseurs à reconnaître, au contraire,
que cette invariabilité des lois naturelles est, pour l'esprit humain, le
laborieux résultat général d'une acquisition lente et graduelle, aussi
bien chez l'espèce que chez l'individu. Or, le sentiment de cette
rigoureuse constance ne pouvait se développer directement tant que
l'esprit purement théologique conservait son plus grand ascendant
mental, sous le régime du fétichisme, si évidemment caractérisé par
l'extension immédiate et absolue des idées de vie, tirées du type
humain, à tous les phénomènes extérieurs. En appréciant
convenablement une telle situation, on cesse de trouver étranges les
fréquentes hallucinations que pouvait produire, chez des hommes
énergiques, une activité intellectuelle aussi imparfaitement réglée, à
la moindre surexcitation déterminée par le jeu spontané des
passions humaines, ou quelquefois provoquée volontairement par
diverses stimulations spéciales, que plusieurs biologistes ont déjà
assez judicieusement signalées, comme la pratique de certains
mouvemens graduellement convulsifs, l'usage de quelques boissons
ou vapeurs fortement enivrantes, l'emploi de frictions susceptibles
d'effets analogues, etc. Sans recourir même à ces moyens
particuliers, dont l'histoire nous montre cependant la fréquente
influence, les causes naturelles d'aberration commune sont alors
tellement prononcées, que, par une convenable appréciation, on
devra, ce me semble, féliciter bien plutôt l'esprit humain de ce que
sa rectitude fondamentale a si souvent contenu, pendant cette
première enfance, la direction illusoire que les seules théories alors
possibles tendaient à lui imprimer presque indéfiniment.
Considérée quant aux beaux-arts, l'action générale du fétichisme
sur l'intelligence humaine n'est point certainement aussi oppressive,
à beaucoup près, que sous l'aspect scientifique. Il est même évident
qu'une philosophie qui animait directement la nature entière, devait
tendre à favoriser éminemment l'essor spontané de notre
imagination, alors nécessairement investie d'une haute
prépondérance mentale. Aussi les premiers essais de tous les beaux-
arts, sans en excepter la poésie, remontent-ils incontestablement
jusqu'à l'âge du fétichisme. Mais le polythéisme ayant dû stimuler
bien davantage encore leur développement propre, il convient, pour
abréger, de remettre au chapitre suivant l'ensemble des
considérations très sommaires que nous devrons indiquer à ce sujet.
Il s'agira alors essentiellement d'expliquer comment, dans la vie
collective comme dans la vie individuelle, l'essor positif des facultés
humaines a dû s'opérer d'abord par les facultés d'expression, de
manière à accélérer graduellement l'évolution plus tardive des
facultés supérieures et moins prononcées, d'après la liaison générale
que notre organisation établit entre elles.
Quant au développement industriel, philosophiquement défini,
c'est-à-dire embrassant l'ensemble total de l'action de l'homme sur le
monde extérieur, il remonte, incontestablement, jusqu'à ce premier
âge social, où l'humanité, sous les plus importans aspects, a jeté les
bases élémentaires de sa conquête générale du globe terrestre. Trop
disposés maintenant à méconnaître les services indispensables de
ces temps primitifs, nous oublions que l'industrie humaine leur doit
surtout la première ébauche de ses ressources les plus puissantes,
l'association de l'homme avec les animaux disciplinables, l'usage
permanent du feu, et l'emploi des forces mécaniques; et, même le
commerce proprement dit y trouve son premier essor distinct, par la
naissante institution des monnaies. En un mot, presque tous les arts
et procédés industriels y ont nécessairement leur origine
fondamentale. Mais, en outre, l'exercice effectif de l'activité humaine
accomplit alors spontanément une fonction préliminaire d'une haute
importance pour l'ensemble de notre évolution, en préparant, pour
ainsi dire, le théâtre ultérieur de la civilisation, comme l'éloquente
appréciation de Buffon est si propre à le faire sentir, dans son
admirable parallèle entre la nature brute et la nature perfectionnée
par l'homme. L'action destructive que les peuplades primitives de
chasseurs se plaisent à développer avec tant d'énergie, n'est pas
seulement utile au genre humain comme offrant souvent un motif
immédiat de liaison, quelquefois fort étendue, entre les diverses
familles, en un temps où il est difficile d'apercevoir, sinon pour la
guerre, d'autres motifs équivalens. Mais une telle destruction est
surtout directement indispensable au développement social ultérieur,
dont la scène nécessaire se trouve d'abord évidemment encombrée
par la multiplicité supérieure des animaux de toute espèce. Aussi
cette énergie destructive est-elle alors tellement prononcée, qu'on a
pu quelquefois y voir, sans trop d'invraisemblance, une cause
secondaire susceptible de concourir, avec les puissances
prépondérantes considérées en géologie, à l'entière disparition de
certaines races, surtout parmi les plus grandes. On peut faire des
remarques essentiellement analogues sur les dévastations exercées
ensuite par les peuples pasteurs, et qui affectent plus spécialement
la végétation superflue. Mais, si l'on ne peut méconnaître, sous ces
divers aspects, la participation essentielle de cet âge primitif à
l'évolution industrielle de l'humanité, il est difficile aujourd'hui
d'apprécier exactement la véritable influence du fétichisme sur ce
genre de développemens[6]. Au premier abord, la consécration
directe de la plupart des corps extérieurs semble même devoir
tendre à interdire à l'homme toute grave modification du monde
environnant. Il n'est pas douteux, en effet, que l'influence prolongée
du fétichisme ne constitue, sous ce rapport, de véritables et puissans
obstacles, qui deviendraient presque insurmontables si l'esprit
humain pouvait jamais être, surtout alors, pleinement conséquent, et
si ces croyances ne pouvaient être, à cet égard, suffisamment
neutralisées par l'opposition mutuelle que leur nature comporte si
aisément, quand quelque instinct puissant s'y trouve intéressé.
Toutefois, outre cet important antagonisme spontané, le fétichisme
présente déjà, à un haut degré, cette précieuse propriété générale
que j'ai signalée, en principe, au chapitre précédent, comme
inhérente au régime théologique, de favoriser le premier essor de
l'activité humaine, par les illusions fondamentales qu'il inspire sur la
prépondérance de l'homme, auquel le monde entier doit sembler
subordonné, tant que l'invariabilité des lois naturelles n'est point
encore reconnue. Quoique cette suprématie ne soit alors réalisable
que par l'irrésistible intervention des agens divins, il n'est pas moins
évident que le sentiment continu de cette protection suprême doit
être, à cette époque, éminemment propre à exciter et à soutenir
l'énergie active de l'homme, malgré d'immenses obstacles extérieurs,
qu'il ne pourrait sans doute oser autrement braver. Ainsi, quelque
imparfaite, et même précaire, que soit nécessairement une telle
stimulation, il y faut voir une indispensable ressource, jusqu'aux
temps très récens où la connaissance des lois de la nature est assez
avancée pour servir de base rationnelle et solide à l'action, à la fois
sage et hardie, de l'humanité sur le monde extérieur. Or, cette
fonction provisoire convient alors d'autant mieux au fétichisme, qu'il
présente à l'homme, de la manière la plus directe et la plus
complète, le naïf espoir d'un empire presque illimité, à obtenir par la
voie religieuse activement suivie. Plus on méditera sur ces temps
primitifs, plus on sentira que le pas principal y devait consister, au
physique comme au moral, à retirer l'esprit humain de sa torpeur
animale: et c'eût été aussi, à l'un et à l'autre égard, le pas le plus
difficile, si l'essor spontané de la philosophie théologique, à l'état
initial de fétichisme, n'eût ouvert définitivement la seule issue qui fût
alors possible. Quand on examine convenablement les illusions
caractéristiques de ce premier âge, sur la faculté mystérieuse
d'observer immédiatement les évènemens les plus lointains et les
plus cachés, sur le pouvoir de modifier le cours des astres, d'apaiser
ou d'exciter les tempêtes, etc., le sourire spontané d'un dédain peu
philosophique fait place à l'appréciation rationnelle qui nous y
montre les symptômes nécessaires de l'éveil primordial de notre
intelligence et de notre activité.
Note 6: Quoique le point de vue concret doive être ici
soigneusement écarté, d'après les explications préalables de cette
leçon, je crois cependant, afin de prévenir, autant que possible,
toute confusion dans les vérifications spéciales, devoir avertir, à ce
sujet, que je n'entends pas ainsi établir une correspondance
nécessaire entre le fétichisme et l'un seulement des trois modes
généraux d'existence matérielle qu'on a coutume de distinguer
parmi les peuples primitifs, successivement chasseurs, pasteurs et
agriculteurs. Je sais qu'on peut citer plusieurs exemples de
nations pastorales déjà parvenues au polythéisme, et d'autres de
nations agricoles restées fétichistes. Mais, malgré cette diversité
effective, je continue l'appréciation abstraite en supposant les
deux transitions matérielles toujours accomplies avant la cessation
du fétichisme; parce qu'il existe, en effet, comme on va le voir, un
motif fondamental pour qu'il en soit ainsi, quoique cette tendance
spontanée puisse être, en certains cas particuliers que je n'ai
point à analyser, surmontée par des influences contraires.

Enfin, sous le point de vue social proprement dit, le fétichisme,


quoique ayant dû être, d'après nos explications antérieures, moins
efficace, en général, que les autres modes ultérieurs de l'esprit
théologique, offre cependant des propriétés réelles d'une haute
importance pour l'ensemble du développement humain. Nous
sommes maintenant, surtout à cet égard, trop disposés à
méconnaître les immenses bienfaits des influences religieuses,
auxquelles ceux même qui s'en croient encore le plus intimement
pénétrés sont déjà fort éloignés d'attribuer suffisamment tous les
progrès qu'elles ont réellement déterminés, quand ils ont dépendu
de croyances actuellement éteintes. Aussi bien sous le rapport social
que sous le rapport intellectuel, la philosophie positive, quelque
paradoxale que semble d'abord chez elle une semblable propriété,
peut seule, au fond, faire enfin dignement apprécier toute la haute
participation nécessaire de l'esprit religieux à l'ensemble de la
grande évolution. Or, ici n'est-il pas directement évident que les
efforts moraux devant, par une invincible nécessité organique,
presque toujours combattre, à un degré quelconque, les plus
énergiques impulsions de notre nature, l'esprit théologique avait
besoin de fournir à la discipline sociale une base générale
indispensable, en un temps où la prévoyance, soit collective, soit
individuelle, était certainement beaucoup trop limitée pour offrir un
point d'appui suffisant aux influences purement rationnelles? Même
à des époques bien moins arriérées, les institutions qui deviennent
ensuite le mieux susceptibles d'être habituellement rattachées à de
simples motifs humains, doivent long-temps reposer sur de tels
fondemens, jusqu'à ce que notre raison soit assez affermie: c'est
ainsi, par exemple, que nous voyons même les moindres préceptes
hygiéniques ne pouvoir d'abord s'établir, d'une manière fixe et
commune, que sous la haute autorité des prescriptions religieuses.
Une irrésistible induction doit donc nous faire sentir la nécessité
primitive de la consécration théologique dans les modifications
sociales où l'on est aujourd'hui le moins disposé à concevoir son
intervention. Ainsi, on la regarde d'ordinaire comme essentiellement
étrangère à l'essor graduel et régulier de l'esprit de propriété
inhérent à l'homme; et, cependant, l'analyse approfondie de
certaines phases remarquables de la sociabilité me semble indiquer
clairement, à cet égard, un indispensable concours de l'influence
religieuse: telle est, entre autres, cette célèbre institution du Tabou,
si importante chez les peuples les plus avancés de l'Océanie, et qui,
à mon gré, constitue aujourd'hui, pour le philosophe, une précieuse
trace de l'universelle participation spéciale des croyances
théologiques à la consolidation primitive de la propriété territoriale,
lorsque les peuples chasseurs ou pasteurs passent finalement à l'état
agricole. Quoique les liaisons d'idées propres à ces âges primitifs
soient aujourd'hui très difficilement saisissables, même d'après une
saine théorie, à cause du point de vue trop différent où nous
sommes forcément placés, il est pareillement très vraisemblable que
l'influence religieuse a beaucoup contribué d'abord à établir, et
surtout à régulariser, l'usage continu des vêtemens, justement
regardé comme l'un des principaux indices de la civilisation
naissante, non-seulement par l'évidente impulsion qu'en doivent
constamment recevoir nos aptitudes industrielles, mais bien plus
encore sous le rapport moral, où il constitue le premier grand
témoignage de l'admirable série des efforts graduels de l'homme
pour améliorer, autant que possible, sa propre nature, en y
développant de plus en plus la haute discipline permanente que
notre raison doit exercer sur nos penchans, afin de faire
convenablement éclater la supériorité implicite de notre organisation
propre.
Outre l'appréciation beaucoup trop étroite de l'ancienne
intervention sociale de l'esprit théologique, on se forme trop souvent
une très fausse idée de ce puissant moyen, même dans la plupart
des cas où l'on n'en saurait méconnaître l'efficacité, en le concevant
surtout comme un simple artifice, appliqué, par les hommes
supérieurs, sans aucune conviction personnelle, au gouvernement
usuel de la multitude. Bien peu de philosophes, y compris les plus
religieux, sont aujourd'hui exempts de cette irrationnelle disposition,
quant à toutes les diverses phases antérieures de l'humanité. C'est
pourquoi il convient ici de présenter directement à ce sujet quelques
indications sommaires, qui, applicables à l'ensemble de notre
opération historique, y devront prévenir ou rectifier, autant que
possible, de vicieuses appréciations, aussi radicalement contraires à
toute saine explication des faits sociaux qu'injurieuses au caractère
moral de l'homme.
Malgré la vaine réputation de haute habileté politique qu'on a si
étrangement tenté de faire à la dissimulation et même à l'hypocrisie,
il est heureusement incontestable, soit d'après l'expérience
universelle, soit par l'étude approfondie de la nature humaine, qu'un
homme vraiment supérieur n'a jamais pu exercer aucune grande
action sur ses semblables sans être d'abord lui-même intimement
convaincu. Cette condition préalable ne tient pas seulement à ce
qu'il ne saurait exister d'action morale là où il n'y aurait point une
suffisante harmonie mutuelle de sentimens et de pensées. De plus,
cette chimérique duplicité mentale, à laquelle on n'a pas craint ainsi
d'attribuer souvent d'importans effets, tendrait nécessairement, au
contraire, à paralyser directement les principales facultés de ceux qui
se seraient dès lors imposé la tâche, évidemment impossible, de
conduire simultanément leurs pensées par deux voies opposées,
l'une réelle, l'autre affectée, dont chacune eût d'ordinaire déjà
suffisamment embarrassé notre faible intelligence. On n'a pu se
laisser communément entraîner à cette absurde supposition, que
d'après une difficulté presque insurmontable à comprendre la vraie
nature d'un état mental trop éloigné, par une suite funeste, mais
rarement évitable, du caractère absolu qui vicie encore si
radicalement la plupart des opinions philosophiques, et que la
prépondérance générale de l'esprit positif pourra seule entièrement
rectifier.
En reconnaissant, comme on ne peut plus l'éviter, que les
théories théologiques ont dû long-temps diriger l'exercice de notre
intelligence dans ses plus simples spéculations, ce serait sans doute
une étrange inconséquence que de persister à méconnaître leur
prépondérance réelle dans les méditations sociales et politiques,
dont la complication supérieure devait d'abord exiger bien davantage
cette puissante intervention. Serait-il possible que les esprits chez
lesquels un tel régime constitue directement la base nécessaire de
tout le système mental, ne l'étendissent point spontanément à leurs
recherches les plus importantes et les plus difficiles? Les législateurs
de ces temps primitifs étaient donc, inévitablement, aussi sincères,
en général, dans leurs conceptions théologiques sur la société que
dans celles qui se rapportaient au monde extérieur: les aberrations
pratiques, quelquefois si horribles, auxquelles ils furent trop souvent
conduits par ces imparfaites théories, constituent elles-mêmes
presque toujours d'irrécusables témoignages de cette sincérité
fondamentale.
Pour rectifier complétement la grave erreur philosophique que
nous examinons, et qui s'oppose éminemment à toute saine
appréciation du passé humain, il me reste seulement à expliquer ici
la tendance spontanée de cette politique essentiellement
théologique des temps primitifs à fournir des inspirations qui
devaient coïncider, dans la plupart des cas ordinaires, avec les
principales nécessités sociales correspondantes. Cette coïncidence
habituelle devait résulter naturellement de deux propriétés
importantes, mutuellement supplémentaires, l'une commune à
toutes les phases religieuses, l'autre spéciale à chacune d'elles, et
qu'il suffira d'indiquer très brièvement. La première consiste en ce
que, par le vague presque indéfini qui les caractérise toujours plus
ou moins, les croyances religieuses sont éminemment susceptibles
de se modifier spontanément selon les exigences diverses de chaque
application politique, de manière à sanctionner finalement, sans
aucun artifice volontaire, les inspirations même qui n'en seraient pas
d'abord émanées, pour peu qu'elles correspondent au sentiment
intime d'un besoin véritable, individuel ou social. Tel est surtout le
Welcome to Our Bookstore - The Ultimate Destination for Book Lovers
Are you passionate about books and eager to explore new worlds of
knowledge? At our website, we offer a vast collection of books that
cater to every interest and age group. From classic literature to
specialized publications, self-help books, and children’s stories, we
have it all! Each book is a gateway to new adventures, helping you
expand your knowledge and nourish your soul
Experience Convenient and Enjoyable Book Shopping Our website is more
than just an online bookstore—it’s a bridge connecting readers to the
timeless values of culture and wisdom. With a sleek and user-friendly
interface and a smart search system, you can find your favorite books
quickly and easily. Enjoy special promotions, fast home delivery, and
a seamless shopping experience that saves you time and enhances your
love for reading.
Let us accompany you on the journey of exploring knowledge and
personal growth!

ebookball.com

You might also like